Sesuaikan kaedah kawasan penghantaran Woocommerce
P粉558478150
2023-08-29 10:57:38
<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>
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/ p>
Untuk menggunakan fungsi tetapan/API anda mesti nyatakan
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
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):
Jika anda ingin menggunakan API tetapan contoh (khusus wilayah penghantaran):
Pastikan pembina anda kelihatan seperti ini/mengandungi kod berikut:
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.