Rumah  >  Soal Jawab  >  teks badan

Sesuaikan kaedah kawasan penghantaran Woocommerce

<p>Saya menghabiskan beberapa jam cuba mencari cara yang betul untuk melaksanakan penyelesaian bagi mencipta kaedah kawasan penghantaran tersuai. </p> <p>WC:7.2.2 Tekanan kerja: 6.0.3</p> <p>Tapak berada dalam keadaan sihat, tiada ralat kebenaran dll (hanya mengemas kini maklumat yang tersedia)</p> <p>Saya menggunakan beberapa sumber seperti: https://woocommerce.github.io/woocommerce-rest-api-docs/?php#shipping-zone-methods</p> <p>https://github.com/woocommerce/woocommerce/wiki/Shipping-Method-API#properties</p> <p>https://gist.github.com/mikejolley/3b37b9cc19a774665f31</p> <p>https://code.tutsplus.com/tutorials/create-a-custom-shipping-method-for-woocommerce--cms-26098</p> <p>Ada banyak lagi. </p> <p>Pada asasnya, saya memerlukan kod sampel untuk mencipta (plugin) bagi kaedah zon penghantaran dengan fungsi kos penghantaran tersuai. Kami berdasarkan Tempahan Mudah Woocommerce dan mempunyai hari dalam metadata itulah sebabnya kami tidak boleh menggunakan salah satu pemalam premium rasmi woocommerce untuk mengendalikannya.</p> <p>我最终得到了以下代码:</p> <pre class="brush:php;toolbar:false;"><?php jika (!defined('ABSPATH')) { keluar; // Keluar jika diakses terus } fungsi your_shipping_method_init() { jika (!class_exists('WC_Your_Shipping_Method')) { kelas WC_Your_Shipping_Method memanjangkan WC_Shipping_Method { /*** Pembina untuk kelas penghantaran anda * * @akses awam * @pemulangan batal*/ fungsi awam __construct() { $this->id = 'penghantaran_hari_diet'; // Id untuk kaedah penghantaran anda. Patutnya unik. $this->method_title = __('Penghantaran setiap hari diet'); // Tajuk ditunjukkan dalam pentadbir $this->method_description = __('Kos penghantaran setiap tempahan'); // Penerangan ditunjukkan dalam pentadbir $this->enabled = "ya"; // Ini boleh ditambah sebagai tetapan tetapi untuk contoh ini ia didayakan secara paksa //$this->title = "Penghantaran Tempahan Mudah setiap hari"; // Ini boleh ditambah sebagai tetapan tetapi untuk contoh ini ia terpaksa. //$this->rates = array('calculate_shipping'); $this->menyokong = array( 'zon penghantaran', 'tetapan contoh', 'modal-tetapan-contoh', ); $ini->instance_form_fields = tatasusunan( 'tajuk' => tatasusunan( 'tajuk' => __('Tajuk Kaedah'), 'jenis' => 'teks', 'penerangan' => __('Ini mengawal tajuk yang pengguna lihat semasa pembayaran.'), 'lalai' => __('Penghantaran harian untuk diet Anda'), ), 'kos' => tatasusunan( 'tajuk' => __('Kos'), 'jenis' => 'nombor', 'penerangan' => __('Ini mengawal kos setiap hari.'), 'lalai' => 7, ) ); $ini->init(); $this->title = $this->get_option('title'); $ini->kos = $ini->dapatkan_pilihan('kos'); add_action('woocommerce_update_options_shipping_' . $ini->id, array($this, 'process_admin_options')); }/*** Mulakan tetapan anda * * @akses awam * @pemulangan batal*/ fungsi init() { // Muatkan API tetapan $ini->init_form_fields(); // Simpan tetapan dalam pentadbir jika anda mempunyai sebarang definisi add_action('woocommerce_update_options_shipping_' . $this->id, array($this, 'process_admin_options')); } fungsi init_form_fields() { $this->form_fields = tatasusunan( 'tajuk' => tatasusunan( 'tajuk' => __('Tajuk Kaedah'), 'jenis' => 'teks', 'penerangan' => __('Ini mengawal tajuk yang pengguna lihat semasa pembayaran.'), 'lalai' => __('Kos penghantaran diet harian'), ), 'kos' => tatasusunan( 'tajuk' => __('Kos'), 'jenis' => 'nombor', 'penerangan' => __('Ini mengawal kos setiap hari.'), 'lalai' => 7, ) ); } /*** fungsi mengira_penghantaran. * @param array $package (lalai: array())*/ fungsi awam mengira_penghantaran($pakej = tatasusunan()) { //hardcode untuk ujian $nombor_penghantaran = 7; //mungkin cara untuk mengira kos penghantaran akhir /* foreach ($pakej['kandungan'] sebagai $item_id => $values) { $_product = $values['data']; $nombor_penghantaran = $nombor_penghantaran + $_produk->wceb_mendapatkan_tempoh_tempahan_produk() * $nilai['kuantiti']; }*/ $this->add_rate(array( 'id' => $ini->id . $ini->instance_id, 'label' => 'Dostawa poza Wa-wa', 'kos' => $shipping_number, )); } } } } add_action('woocommerce_shipping_init', 'your_shipping_method_init'); fungsi add_your_shipping_method($methods) { $methods['diet_day_shipping'] = 'WC_Your_Shipping_Method'; kembali $kaedah; } add_filter('woocommerce_shipping_methods', 'add_your_shipping_method');</pre> <p>我需要有 2 个设置(只能在区域、方法中,不需要全局)标题(向我客多人游戏天数的价值。</p> <p>我想要“编辑”按钮显示以下关于运输区域方法的方法,我可以在其中可设。</p> <p>Bolehkah sesiapa membantu membetulkan kod saya? </p> <p>Tiada pilihan tetapan pada masa ini dipaparkan dalam panel pentadbir. Bukan dalam baris kaedah kawasan penghantaran, dan bukan dalam panel tetapan sgipping. </p> <p>Selain itu, apabila saya menghantar poskod dari zon menggunakan kaedah penghantaran tersuai - troli menunjukkan bahawa tiada kaedah penghantaran tersedia untuk poskod tersebut)</p>
P粉558478150P粉558478150389 hari yang lalu425

membalas semua(1)saya akan balas

  • P粉833546953

    P粉8335469532023-08-30 00:08:08

    Saya juga menghabiskan tiga jam semalam dan satu jam lagi hari ini cuba memikirkan masalah yang hampir sama. Saya percaya saya kini mempunyai penyelesaian, atau sekurang-kurangnya membantu membawa anda ke arah yang betul. Dokumentasi rasmi WooCommerce nampaknya membezakan antara Tetapan dan Tetapan Contoh (atau saya tidak dapat mencari dokumentasi tentang Tetapan Contoh - lebih banyak lagi dalam perenggan seterusnya).

    Berikut adalah berdasarkan apa yang saya temui setakat ini melalui percubaan dan kesilapan. Jika sesiapa mempunyai sebarang dokumentasi "rasmi" tentang perkara ini, saya tidak sabar-sabar untuk mengulas mengenai balasan ini.

    Adalah penting untuk membezakan antara "tetapan" dan "tetapan instance". Lihat imej ini untuk perbandingan visual pada bahagian belakang WooCommerce:

    Tetapan

    Tetapan merujuk kepada "Tetapan Mod Penghantaran Global", iaitu ia muncul dalam submenu global, tetapi tidak dalam kawasan penghantaran. Dokumentasi rasmi WooCommerce menunjukkan cara menggunakan tetapan dan cara menambah halaman tetapan baharu:

    https://woocommerce.com/document/shipping-method-api/

    https://woocommerce.com/document/settings-api/

    Untuk menggunakan fungsi tetapan/API anda mesti nyatakan

    $this->supports = array('settings'); // You may also need to include shipping-zones

    Dalam pembina anda.

    "Tetapan" digunakan/digunakan/disimpan secara global, iaitu secara bebas daripada kawasan penghantaran individu.

    Tetapan instance

    Tetapan instance ialah tetapan yang boleh disimpan secara individu untuk setiap kawasan penghantaran. Untuk menggunakannya anda perlu menggunakan

    $this->supports = array('shipping-zones', 'instance-settings', 'instance-settings-modal');

    Dalam pembina anda.

    Contoh berikut membolehkan saya memahami perbezaan halus tetapi penting bagi API persediaan contoh:

    https://gist.github.com/malkafly/57a5e07fd03d6fd5cab84c6182d84c86

    Perbezaan kod dan berkenaan soalan asal anda

    Sila ambil perhatian bahawa terdapat perbezaan yang ketara dalam fungsi dan sifat yang tepat bagi kedua-dua API ini. Bergantung pada situasi anda, anda harus memutuskan untuk menggunakan salah satu API ini dan kemudian menggunakan API itu dengan ketat. Anda mengelirukan kedua-dua API, yang mungkin menyebabkan anda tidak boleh menggunakan kaedah penghantaran tersuai anda.

    Jika anda ingin menggunakan API tetapan (global):

    • $this->supports = array('shipping-zones', 'settings');
    • Gunakan $this->form_fields (bukannya $this->instance_form_fields)
    • Gunakan $this->settings['title'] untuk mendapatkan semula tetapan yang disimpan

    Jika anda ingin menggunakan API tetapan contoh (khusus wilayah penghantaran):

    • Pastikan pembina anda kelihatan seperti ini/mengandungi kod berikut:

      public function __construct( $instance_id = 0 ) {
                $this->instance_id = absint( $instance_id );
                //...
          }
    • Gunakan $this->instance_settings['title'] untuk mendapatkan semula tetapan yang disimpan

    Pautan dalam kategori tetapan/tetapan contoh yang sepadan yang saya siarkan di atas mengandungi banyak contoh kod tambahan (berfungsi) untuk setiap kaedah.

    balas
    0
  • Batalbalas