{"id":6084,"date":"2021-07-11T07:04:02","date_gmt":"2021-07-11T07:04:02","guid":{"rendered":"https:\/\/musilda.cz\/?p=6084"},"modified":"2021-07-11T07:04:02","modified_gmt":"2021-07-11T07:04:02","slug":"jak-vytvorit-vlastni-dopravni-metodu-ve-woocommerce","status":"publish","type":"post","link":"https:\/\/affinite.io\/cs\/jak-vytvorit-vlastni-dopravni-metodu-ve-woocommerce\/","title":{"rendered":"Jak vytvo\u0159it vlastn\u00ed dopravn\u00ed metodu ve WooCommerce"},"content":{"rendered":"\n<p>V\u00fdchoz\u00ed dopravn\u00ed metody, kter\u00e9 jsou ve WooCommerce k dispozici, nejsou v\u017edy vyu\u017eiteln\u00e9, pro konkr\u00e9tn\u00ed po\u017eadavky na dopravu zbo\u017e\u00ed. N\u011bkdy si proto mus\u00edte vytvo\u0159it vlastn\u00ed dopravn\u00ed metodu. <\/p>\n\n\n\n<p>P\u016fvodn\u011b jsem sem cht\u011bl jenom &#8222;pl\u00e1cnout&#8220; hotovu t\u0159\u00eddu a hotovo. Lep\u0161\u00ed to ale bude vz\u00edt bod po bodu. <\/p>\n\n\n\n<p>Vlastn\u00ed dopravu vytvo\u0159\u00edte tak, \u017ee si ud\u011bl\u00e1te plugin, kter\u00fd bude obsahovat t\u0159\u00eddu dopravy. <\/p>\n\n\n\n<p>Nejprve si mus\u00edte vytvo\u0159it soubor pluginu, m\u016f\u017eete jej nazvat t\u0159eba custom-shipping.php a ulo\u017eit jej do slo\u017eky plugins. <\/p>\n\n\n\n<p>Na za\u010d\u00e1tek pluginu p\u0159id\u00e1te hlavi\u010dku, aby WordPress poznal, \u017ee jde o plugin:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * @wordpress-plugin\n * Plugin Name:       Custom shipping\n * Plugin URI:\n * Description:\n * Version:           1.0\n * Author:\n * Author URI:\n * Text Domain:       custom-shipping\n * License:           GPL-2.0+\n * License URI:       http:\/\/www.gnu.org\/licenses\/gpl-2.0.txt\n * Domain Path:       \/languages\n *\/<\/code><\/pre>\n\n\n\n<p>V druh\u00e9m kroku p\u0159id\u00e1te funkci woocommerce_custom_shipping_init, kter\u00e1 se bude p\u0159es hook plugin_loaded prov\u00e1d\u011bt po na\u010dten\u00ed pluginu a kter\u00e1 obsahuje t\u0159\u00eddu custom dopravy. Na konec souboru p\u0159id\u00e1me funkci, pomoc\u00ed kter\u00e9 p\u0159id\u00e1me do pole dostupn\u00fdch doprav dopravn\u00ed metodu. Kl\u00ed\u010d polo\u017eky pole je id dopravy, hodnotou je n\u00e1zev t\u0159\u00eddy. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function woocommerce_custom_shipping_init(){\n\n\tif ( !class_exists( 'WC_Shipping_Method' ) ) {\n      \treturn;\n\t}\n\n\tif ( ! class_exists( 'WC_Custom_Shipping_Method' ) ) {\n\n\t\tclass WC_Custom_Shipping_Method extends WC_Shipping_Method {\n\n\t\t}\n\n\t}\n\n}\nadd_action('plugins_loaded', 'woocommerce_custom_shipping_init');\n\nfunction add_woo_custom_shipping_method( $methods ) {\n\t$methods&#091;'custom'] = 'WC_Custom_Shipping_Method';\n\treturn $methods;\n}\nadd_filter( 'woocommerce_shipping_methods', 'add_woo_custom_shipping_method' );<\/code><\/pre>\n\n\n\n<p>T\u0159et\u00ed krok je vytvo\u0159en\u00ed konstruktoru. <\/p>\n\n\n\n<p>V n\u011bm mus\u00edme definovat<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>id dopravy &#8211; mus\u00ed odpov\u00eddat hodnot\u011b ve funkci add_woo_custom_shipping_method<\/li><li>instance id &#8211; nastav\u00ed se automaticky p\u0159i vytvo\u0159en\u00ed objektu<\/li><li>n\u00e1zev dopravy &#8211; zobrazeno v administraci<\/li><li>popis dopravy &#8211; zobrazeno v administraci<\/li><li>co doprava podporuje<\/li><li>vygenerujeme si formul\u00e1\u0159 nastaven\u00ed<\/li><li>povoleno nastav\u00edme na ano<\/li><li>z option si na\u010dteme n\u00e1zev dopravy &#8211; zobrazuje se na pokladn\u011b<\/li><li>popis dopravy- zobrazuje se na pokladn\u011b<\/li><li>dostupnost dopravy<\/li><li>na z\u00e1v\u011br akce pro ulo\u017een\u00ed formul\u00e1\u0159e nastaven\u00ed<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * Constructor for your shipping class\n *\n * @access public\n * @return void\n *\/\npublic function __construct( $instance_id = 0 ) {\n\n\t$this-&gt;id                 = 'custom';\n\t$this-&gt;instance_id        = absint( $instance_id );\n\t$this-&gt;method_title       = __( 'Custom shipping', 'custom-shipping' );\n\t$this-&gt;method_description = __( 'Custom shipping for WooCommerce', 'custom-shipping' );\n\n\t$this-&gt;supports           = array(\n              'shipping-zones',\n              'instance-settings',\n              'instance-settings-modal',\n\t);\n\n\t$this-&gt;init_form_fields();\n\n\t$this-&gt;enabled            = \"yes\";\n\t$this-&gt;title              = $this-&gt;get_option( 'title' );\n\t$this-&gt;description        = $this-&gt;get_option( 'description' );\n\t$this-&gt;availability       = $this-&gt;get_option( 'availability' );\n\n\tadd_action( 'woocommerce_update_options_shipping_' . $this-&gt;id, array( $this, 'process_admin_options' ) );\n\n}<\/code><\/pre>\n\n\n\n<p>P\u0159id\u00e1me formul\u00e1\u0159 nastaven\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * Init form fields\n *\n * @access public\n *\/\npublic function init_form_fields() {\n\n\t$this-&gt;instance_form_fields = array(\n\t\t'enabled'     =&gt; array(\n\t\t\t'title'       =&gt; __( 'Enable', 'custom-shipping' ),\n\t\t\t'type' \t      =&gt; 'checkbox',\n\t\t\t'label'       =&gt; __( 'Enable custom shippng', 'custom-shipping' ),\n\t\t\t'default'     =&gt; 'yes',\n\t\t),\n\t\t'title'       =&gt; array(\n\t\t\t'title'       =&gt; __( 'Title', 'custom-shipping' ),\n\t\t\t'type'        =&gt; 'text',\n\t\t\t'description' =&gt; __( 'Method title', 'custom-shipping' ),\n\t\t\t'default'     =&gt; __( 'Custom shipping', 'custom-shipping' ),\n\t\t),\n\t\t'description' =&gt; array(\n\t\t\t'title'       =&gt; __( 'Description', 'custom-shipping' ),\n\t\t\t'type'        =&gt; 'text',\n\t\t\t'description' =&gt; __( 'Shipping description', 'custom-shipping' ),\n\t\t\t'default'     =&gt; __( 'Custom shipping for WooCommerce', 'custom-shipping' ),\n\t\t),\n\t\t'cost'        =&gt; array(\n\t\t\t'title'       =&gt; __( 'Price', 'custom-shipping' ),\n\t\t\t'type'        =&gt; 'text'\n\t\t),\n\t);\n\n}<\/code><\/pre>\n\n\n\n<p>Tato metoda je jen jedno velk\u00e9 pole, kde ka\u017ed\u00e1 polo\u017eka je jedno formul\u00e1\u0159ov\u00e9 pol\u00ed\u010dko v administraci:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2021\/07\/custom-shipping-admin.png\"><img loading=\"lazy\" decoding=\"async\" width=\"951\" height=\"381\" src=\"https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2021\/07\/custom-shipping-admin.png\" alt=\"\" class=\"wp-image-6089\" srcset=\"https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2021\/07\/custom-shipping-admin.png 951w, https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2021\/07\/custom-shipping-admin-300x120.png 300w, https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2021\/07\/custom-shipping-admin-768x308.png 768w\" sizes=\"auto, (max-width: 951px) 100vw, 951px\" \/><\/a><\/figure>\n\n\n\n<p>Tak\u017ee, pokud budete cht\u00edt p\u0159id\u00e1vat dal\u0161\u00ed nastaven\u00ed, s kter\u00fdm budete cht\u00edt v doprav\u011b pracovat, sta\u010d\u00ed jen roz\u0161\u00ed\u0159it toto pole. <\/p>\n\n\n\n<p>K hodnot\u00e1m se pak p\u0159istupuje p\u0159es $this-&gt;get_option( id_pole );<\/p>\n\n\n\n<p>A nakonec vytvo\u0159\u00edme dv\u011b metody, kter\u00e9 jsou velmi d\u016fle\u017eit\u00e9, proto\u017ee v nich budeme ur\u010dovat, kolik doprava stoj\u00ed a zda se m\u016f\u017ee aktivn\u011b zobrazovat:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * Calculate_shipping function.\n *\n * @access public\n *\/\npublic function calculate_shipping( $package = array() ) {\n\n\t$cost = $this-&gt;get_option( 'cost' );\n\n\t$rate = array(\n\t\t'id' \t\t=&gt; $this-&gt;id,\n\t\t'label' \t=&gt; $this-&gt;title,\n\t\t'calc_tax'\t=&gt; 'per_order',\n\t\t'cost' \t\t=&gt; $cost\n\t);\n\n\t$this-&gt;add_rate( $rate );\n\n}\n\t<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * Is available shipping\n *\n * @access public\n *\/\npublic function is_available( $package ) {\n\n\tif ( 'no' == $this-&gt;enabled ) {\n\t\treturn false;\n\t}\n\n\treturn apply_filters( 'woocommerce_shipping_' . $this-&gt;id . '_is_available', true, $package );\n\n}<\/code><\/pre>\n\n\n\n<p>V t\u011bchto dvou metod\u00e1ch pak m\u016f\u017eete ud\u011blat podm\u00ednky, kdy se m\u00e1 doprava zobrazovat, zda se bude m\u011bnit jej\u00ed cena, na z\u00e1klad\u011b hmotnosti a podobn\u011b. <\/p>\n\n\n\n<p>Jakmile to cel\u00e9 poskl\u00e1d\u00e1me &#8211; kompletn\u00ed k\u00f3d nejdete zde <a href=\"https:\/\/github.com\/Musilda\/woocommerce-custom-shipping\/blob\/main\/custom-shipping.php\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/Musilda\/woocommerce-custom-shipping\/blob\/main\/custom-shipping.php<\/a> a nahrajete soubor do slo\u017eky plugins, zobraz\u00ed se v\u00e1m v plugine pro aktivaci.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2021\/07\/custom-shipping-plugin.png\"><img loading=\"lazy\" decoding=\"async\" width=\"650\" height=\"113\" src=\"https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2021\/07\/custom-shipping-plugin.png\" alt=\"\" class=\"wp-image-6091\" srcset=\"https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2021\/07\/custom-shipping-plugin.png 650w, https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2021\/07\/custom-shipping-plugin-300x52.png 300w\" sizes=\"auto, (max-width: 650px) 100vw, 650px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Nastav\u00edte stejn\u011b jako ka\u017edou jinou dopravu a m\u00e1te ji k dispozici na pokladn\u011b:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2021\/07\/custom-shipping-checkout.png\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"169\" src=\"https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2021\/07\/custom-shipping-checkout.png\" alt=\"\" class=\"wp-image-6092\" srcset=\"https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2021\/07\/custom-shipping-checkout.png 500w, https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2021\/07\/custom-shipping-checkout-300x101.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/figure>\n\n\n\n<p>A to je v\u0161e. Nyn\u00ed m\u00e1te vytvo\u0159enou vlastn\u00ed dopravu, kterou m\u016f\u017eete upravovat jak budete cht\u00edt. Pro vytvo\u0159en\u00ed dal\u0161\u00ed dopravy, sta\u010d\u00ed vz\u00edt t\u0159\u00eddu, zduplikovat ji a zm\u011bnit jej\u00ed n\u00e1zev a id. <\/p>\n\n\n\n<p>V p\u0159\u00edpad\u011b, \u017ee budete pot\u0159ebovat pomoci s implementac\u00ed vlastn\u00ed custom dopravy, napi\u0161te mi na musilda@musilda.cz. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>V\u00fdchoz\u00ed dopravn\u00ed metody, kter\u00e9 jsou ve WooCommerce k dispozici, nejsou v\u017edy vyu\u017eiteln\u00e9, pro konkr\u00e9tn\u00ed po\u017eadavky na dopravu zbo\u017e\u00ed. N\u011bkdy si proto mus\u00edte vytvo\u0159it vlastn\u00ed dopravn\u00ed metodu. P\u016fvodn\u011b jsem sem cht\u011bl jenom &#8222;pl\u00e1cnout&#8220; hotovu t\u0159\u00eddu a hotovo. Lep\u0161\u00ed to ale bude vz\u00edt bod po bodu. Vlastn\u00ed dopravu vytvo\u0159\u00edte tak, \u017ee si ud\u011bl\u00e1te plugin, kter\u00fd bude obsahovat<\/p>\n","protected":false},"author":1,"featured_media":8732,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_uag_custom_page_level_css":"","footnotes":""},"categories":[25],"tags":[],"class_list":["post-6084","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-woocommerce"],"acf":[],"uagb_featured_image_src":{"full":["https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2016\/05\/wordpress-woocommerce-musilda.png",1200,800,false],"thumbnail":["https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2016\/05\/wordpress-woocommerce-musilda-150x150.png",150,150,true],"medium":["https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2016\/05\/wordpress-woocommerce-musilda-300x200.png",300,200,true],"medium_large":["https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2016\/05\/wordpress-woocommerce-musilda-768x512.png",640,427,true],"large":["https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2016\/05\/wordpress-woocommerce-musilda-1024x683.png",640,427,true],"1536x1536":["https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2016\/05\/wordpress-woocommerce-musilda.png",1200,800,false],"2048x2048":["https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2016\/05\/wordpress-woocommerce-musilda.png",1200,800,false],"archive-list":["https:\/\/affinite.io\/cs\/wp-content\/uploads\/sites\/2\/2016\/05\/wordpress-woocommerce-musilda-400x265.png",400,265,true]},"uagb_author_info":{"display_name":"Affinite","author_link":"https:\/\/affinite.io\/cs\/author\/affinite\/"},"uagb_comment_info":1,"uagb_excerpt":"V\u00fdchoz\u00ed dopravn\u00ed metody, kter\u00e9 jsou ve WooCommerce k dispozici, nejsou v\u017edy vyu\u017eiteln\u00e9, pro konkr\u00e9tn\u00ed po\u017eadavky na dopravu zbo\u017e\u00ed. N\u011bkdy si proto mus\u00edte vytvo\u0159it vlastn\u00ed dopravn\u00ed metodu. P\u016fvodn\u011b jsem sem cht\u011bl jenom &#8222;pl\u00e1cnout&#8220; hotovu t\u0159\u00eddu a hotovo. Lep\u0161\u00ed to ale bude vz\u00edt bod po bodu. Vlastn\u00ed dopravu vytvo\u0159\u00edte tak, \u017ee si ud\u011bl\u00e1te plugin, kter\u00fd bude obsahovat","_links":{"self":[{"href":"https:\/\/affinite.io\/cs\/wp-json\/wp\/v2\/posts\/6084","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/affinite.io\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/affinite.io\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/affinite.io\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/affinite.io\/cs\/wp-json\/wp\/v2\/comments?post=6084"}],"version-history":[{"count":0,"href":"https:\/\/affinite.io\/cs\/wp-json\/wp\/v2\/posts\/6084\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/affinite.io\/cs\/wp-json\/wp\/v2\/media\/8732"}],"wp:attachment":[{"href":"https:\/\/affinite.io\/cs\/wp-json\/wp\/v2\/media?parent=6084"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/affinite.io\/cs\/wp-json\/wp\/v2\/categories?post=6084"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/affinite.io\/cs\/wp-json\/wp\/v2\/tags?post=6084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}