pavelevap / ceske-sluzby

České služby pro WordPress
56 stars 25 forks source link

Doplnit možnost zadávat dobu doručení a EAN u produktů #22

Open pavelevap opened 9 years ago

pavelevap commented 9 years ago

Kód převzat z jiného požadavku: #19

<?php
/** Přidá dobu doručení a EAN k produktu */

// Display Fields
add_action( 'woocommerce_product_options_general_product_data', 'woo_add_custom_general_fields_nt' );

// Save Fields
add_action( 'woocommerce_process_product_meta', 'woo_add_custom_general_fields_save_nt' );

function woo_add_custom_general_fields_nt() {

global $woocommerce, $post;
// Text Field
woocommerce_wp_text_input(
array(
'id' => 'ean',
'label' => __( 'EAN', 'woocommerce' ),
'placeholder' => 'Zadejte EAN',
'desc_tip' => 'true',
'description' => __( 'Zadejte EAN produktu.', 'woocommerce' )
)
);
woocommerce_wp_text_input(
array(
'id' => 'delivery_date',
'label' => __( 'Doručení', 'woocommerce' ),
'placeholder' => 'Zadejte doručení',
'desc_tip' => 'true',
'description' => __( 'Zadejte doručení produktu.', 'woocommerce' )
)
);
}
function woo_add_custom_general_fields_save_nt( $post_id ){

// Textarea
$woocommerce_ean = $_POST['ean'];
if( !empty( $woocommerce_ean ) )
update_post_meta( $post_id, 'ean', esc_html( $woocommerce_ean ) );

// Textarea
$woocommerce_delivery_date = $_POST['delivery_date'];
if( !empty( $woocommerce_delivery_date ) )
update_post_meta( $post_id, 'delivery_date', esc_html( $woocommerce_delivery_date ) );

}

/** Zobrazí dobu doručení v detailu produktu */
add_action( 'woocommerce_single_product_summary', 'doruceni_detail', 5 );
function doruceni_detail() {
    global $product;
    // Do not show this on variable products
    /*if ( $product->product_type <> 'variable' )*/ {
        $dd = get_post_meta( $product->id, 'delivery_date', true );
        if ($dd == 0)
         {$dd = 'Skladem';}
         elseif
         ($dd <= 7)
         {$dd = 'Do týdne';}
         elseif
         ($dd <= 14)
         {$dd = '1 - 2 týdny';}
         elseif
         ($dd <= 21)
         {$dd = '2 - 3 týdny';}
         elseif
         ($dd <= 28)
         {$dd = '2 - 4 týdny';}
         elseif
         ($dd <= 35)
         {$dd = '3 - 5 týdnů';}
         elseif
         ($dd <= 42)
         {$dd = '4 - 6 týdnů';}
         elseif
         ($dd >= 56)
         {$dd = '4 - 7 týdnů';}

        echo '<div class="woocommerce_dd">';
        echo '<span class="delivery--date">' . $dd . '</span><br />';
        /** DOPRAVA ZDARMA */
         $rp = $product->get_price();
         if ($rp >= 10000)
         {echo '<span class="doprava--zdarma">DOPRAVA ZDARMA !!!</span>';}
          echo '</div>';
    }
}

// Optional: To show on archive pages
add_action( 'woocommerce_after_shop_loop_item_title', 'doruceni_detail' );
/** */
remove_filter('woocommerce_cart_item_remove_link', 'woocommerce_cart_item_remove_link');

/**
* Přidá štítek DOPRAVA ZDARMA na stránku s produkty
*/
add_action( 'woocommerce_before_shop_loop_item_title', 'sticky_doprava_zdarma', 10 );

function sticky_doprava_zdarma ()
{
 global $product;
 $sdz = $product->get_price();
         if ($sdz >= 10000)
         {echo '<div class="sdz"><span class="sticky-doprava-zdarma">DOPRAVA ZDARMA</span></div>';}
 }

/**
* Přidá krátký popisek zboží a dobu doručení, které se zobrazí v katalogu nad názvem zboží
*/
add_action('add_meta_boxes', 'product_title_desc_box');
add_action('save_post', 'product_title_desc_save', 1, 2);

function product_title_desc_box(){
    add_meta_box('product_title_desc_box', 'Krátký popisek', 'product_title_desc_form', 'product','side', 'core');
    wp_nonce_field( basename( __FILE__ ), 'smashing_post_class_nonce' );
}
function product_title_desc_form($post){
    wp_nonce_field( basename( __FILE__ ), 'product_title_description_nonce' );
    $title_description = get_post_meta($post->ID, 'title-description', true);
    ?> <p><label for="title-description">Zadejte krátký popisek produktu, který se zobrazí nad nadpisem produktu v katalogu</label>
        <br />
        <input type="text" name="title-description" id="title-description1" value="<?php echo $title_description ; ?>"/>
    </p>
    <?php
}

function product_title_desc_save($post_id, $post ){
    if(!isset( $_POST['title-description']) || !wp_verify_nonce($_POST['product_title_description_nonce'], basename(__FILE__)))
                {
        return $post_id;
                }
                 $post_type = get_post_type_object( $post->post_type );

    /* Check if the current user has permission to edit the post. */
    if ( !current_user_can( $post_type->cap->edit_post, $post_id ) )
        return $post_id;

                $description = $_POST['title-description'] ;
                 update_post_meta( $post_id, 'title-description', $description);

}

add_action( 'woocommerce_before_shop_loop_item_title', 'my_add_short_description', 9 );
function my_add_short_description()
{
global $product;
     {
        $td = get_post_meta( $product->id, 'title-description', true );

        echo '<div class="woocommerce_td">';
        echo '<span class="title-description">' . substr($td, 0, 80) . '<br /></span>'; // Omezí počet znaků výpisu echo na 80 znaků
        echo '</div>';
    }
}

Bude třeba zjistit, co to přesně dělá...

novetrendy commented 9 years ago

Je napsané v komentářích co to dělá, když tak můžu poskytnout další info :)

pavelevap commented 9 years ago

Pokud jsem to dobře pochopil, tak první část přidává políčka k produktům, kam se může zadávat EAN a Datum doručení (a ukládá je do databáze jako uživatelská pole). Zobrazuje se to hned na první záložce (Obecné) při editaci produktu. Budeme asi potřebovat celou vlastní záložku "České služby", kde bude možné nastavit nejen toto, ale i některé položky pro XML feedy.

Datum doručení se zadává jako počet dnů a podle toho se pak zobrazuje příslušná informace. Takže když někdo zadá "5", tak se na webu zobrazí "Do týdne". Podle mě by se nemělo vůbec nic zadávat, ale měly by být předem definované možnosti, ze kterých by uživatel jenom vybíral (a nic sám ručně nezadával)? A nevím, jak to u eshopů funguje, ale neměl by být někde pohromadě nějaký přehled označených výrobků se speciálním datem doručení, aby se mohly snadno změnit (a nikoli složitě dohledávat)? EAN se pak na webu asi nikde nezobrazuje a patrně je používán pouze pro XML feed?

Další část přidává speciální metabox pro "Krátký popisek" (měl by se zobrazovat přímo nad názvem produktu). Jeho použití ale zatím moc nechápu? To je určeno spíše pro nějaký konkrétní web?

A potom tam je ještě nějaká zobrazovaná informace "Doprava ZDARMA", která se objeví, pokud je nějaký produkt nad určitou cenu? A ta cena tam je natvrdo nad 10000. Neměla by se brát podmínka z nastavení klasické dopravy zdarma? To by šlo asi udělat automaticky, tedy pokud by tam byla splněná podmínka a proběhla by přímo u produktu (tedy cena produktu sama o sobě splňuje cenovou podmínku), tak tam zobrazovat nějaký text/banner o dopravě zdarma (ideálně nastavitelný v administraci).

Kód je to sice splácaný, ale nápadů tam je hodně :-)

novetrendy commented 9 years ago

První odstavec jste pochopil dobře. Datum doručení je schválně jako počet dnů, protože mnoho dodavatelů, kteří poskytují feedy pro eshopy je mají v číselné podobě - je to kvůli importu feedů. Nicméně pro uživatele možná bude stačit nějaký dropdown, kde si bude moct vybrat nějakou položku. Můj původní nápad ale byl (neměl jsem čas dokončit), že uživatel si pro jednotlivá čísla(date_delivery) nadefinuje vlastní text, který se bude zobrazovat ve frontendu. EAN se v tomto kódu nezobrazuje (slouží jen pro xml), ale u některých našich webů ano, stačí jen zahookovat a zobrazit.

Krátký popisek byl vytvořen pro některé zákazníky, kteří si to přímo vyžadovali, je to speciálně třeba pro náhradní díly atd. aby návštěvník neviděl jen nadpis, ale i co si má pod tím představit. Viz: http://kvalitni-svitidla.cz.novetrendy.profiwh.com/ (web ve vývoji).

Doprava zdarma byla hodně narychlo, proto jsem to nebral přímo z nastavení dopravy zdarma. Nicméně je tam dvakrát - poprvé v jako 'sticky' - zobrazuje se archivu a podruhé přímo na stránce produktu.

Všechny kódy mám nastylované, ale konkrétně pro mou šablonu, proto jsem css ani nepřikládal. Samozřejmě css můžu nějak univerzálně nastylovat, pokud bude potřeba.

novetrendy commented 9 years ago

Co je potřeba ještě dodat, abychom mohli přidat delivery_date a ean? Můžu Váš kód upravovat a použít dál, samozřejmě s vaším svolením?

pavelevap commented 9 years ago

Kód je pod licencí GPL, takže s ním můžete dělat cokoliv :-)

Přidání EAN asi není nijak složité, datum doručení ještě musím promyslet. Ideální způsob je asi ten, že si uživatel sám nadefinuje vhodné možnosti, tedy např. Skladem, Do týdne, U dodavatele (dva týdny) a každá možnost bude mít také časový interval (0, 1 - 5, atd). Problémem ale bude, co když to pak uživatel změní a u některých produktů to bude historicky zadané? Pro tyto případy by zase bylo lepší předem natvrdo nadefinovat všechny možnosti.

novetrendy commented 9 years ago

Tady bych právě nechal aby uživatel k jednotlivým rozsahům čísel mohl vybrat jen popisek do frontendu. Př: 0 - 'SKLADEM' 1-3 - 'DO TŘÍ DNŮ' Čili rozsah uživatel nemůže změnit (0, 1-3) ale popisek ano (SKLADEM, DO TŘÍ DNŮ) Tím se nedotkne ani feedů ani samotných produktů, protože zadané číslo bude pořád stejné.

pavelevap commented 8 years ago

XML feedy by měly podporovat EAN ukládaný v rámci vlastního uživatelského pole: https://github.com/pavelevap/ceske-sluzby/commit/a7b2dd71545eae0b55bd66a9c7605f695c607c94

Stačí zadat název uživatelského pole v nastavení a vše by mělo automaticky fungovat. Ale chtělo by to vyzkoušet i někým jiným :-)

novetrendy commented 8 years ago

Super, funguje :+1:

pavelevap commented 8 years ago

A mám tu ještě report ohledně problémů s dodací dobou a je třeba to prověřit: Dostupnost zboží mám normálně na eshopu: skladem, nebo skladem na objednání (nebo jak to tam je). Nenašel jsem u Woocommerce, kde a jak by se dalo zadat třeba odesíláme do 3 dnů, nebo na objednání do 7mi dnů. Každopádně mě to tam hází chybu asi u produktů, kde mám zadánu, že to je skladem, ale na objednávku, jak by se to dalo nastavit, opravit, aby se ten feed zvalidoval správně?

novetrendy commented 8 years ago

U Woocommerce toto nelze, proto jsem tady někde postoval i kus kódu, který to řeší přes custom fields. Nemám k tomu admin rozhraní takže si v kódu jen nastavím, co se má zobrazit po zadání určitého čísla. Např: 0 - Skladem, 1 až 3 - do tří dnů apod.

pavelevap commented 8 years ago

Nešlo by dodací dobu ještě zkombinovat s dostupnostním feedem? http://sluzby.heureka.cz/napoveda/dostupnostni-feed/#expandableChapter_delivery_time

A problém se částečně řeší ještě v issue #20.

novetrendy commented 8 years ago

Určitě by to šlo zkombinovat: $dodaci_doba = get_post_meta( $product->id, 'delivery_date', true ); $cas_na doruceni = get options('ceske_sluzby_cas_na_doruceni'); $dodaci_doba = dodaci_doba * 24; $dodaci_doba = $dodaci_doba + $cas_na doruceni; Potom převedeme na hodnotu $dodaci_doba na formát času heureky a ošetříme pro případ NULL podmínkou (if empty) <delivery_time orderDeadline="2011-09-10 12:00">2011-09-11 13:00</delivery_time>

novetrendy commented 8 years ago

Dodací doba má být dostupná i pro varianty?

pavelevap commented 8 years ago

Zrovna o tom přemýšlím :-) Ideální by asi bylo nastavení eshop / kategorie / produkt / varianta, aby se to celé zjednodušilo... Někomu by to stačilo na úrovni eshopu, ale někomu bude třeba chybět jen nějaká barevná varianta.

pavelevap commented 7 years ago

Základní nastavení EAN už je hotové, ale potřebujeme ještě následující:

pavelevap commented 7 years ago

Heureka podporuje EAN-13: http://sluzby.heureka.cz/napoveda/xml-feed/#EAN

Zboží.cz podporuje dokonce EAN-8, UPC-12, EAN-13 a ITF-14: https://napoveda.seznam.cz/cz/zbozi/specifikace-xml-pro-obchody/specifikace-xml-feedu/#EAN

Google podporuje také mnohé formáty (patrně jako Zboží.cz): https://support.google.com/merchants/answer/6324461?hl=en&ref_topic=6324338

Pricemania podporuje ean a part_number (nedefinováno): https://www.pricemania.cz/specifikace-xml-feedu

Zajímavý nástroj: http://www.gs1cz.org/nastroje-a-pomucky/vypocet-kontrolni-cislice/

Nejpoužívanější je asi Heureka, takže se bude většinou zadávat EAN-13. Ale co když někdo bude chtít nějaký jiný EAN? Tak ho zadá, ale na Heurece se nebude zobrazovat. Asi nemá cenu zadávat ve dvou formátech (mít dvě různá políčka)? Pokud má někdo EAN-13, tak bude fungovat všude. Pokud má jiný formát, tak na Heurece stejně fungovat nebude.