Saya mempunyai borang untuk menyerahkan buku baharu ke tapak WooCommerce saya. Saya pernah hanya menyimpan keadaan buku sebagai atribut produk. </p>
// Set the book's condition $condition = $_POST['condition']; wp_set_object_terms( $product_id, $condition, 'pa_condition', true ); $att_condition = Array('pa_condition' =>Array( 'name'=>'pa_condition', 'value'=>$condition, 'is_visible' => '1', 'is_taxonomy' => '1' )); update_post_meta( $product_id, '_product_attributes', $att_condition);
Mudah sahaja. Sekarang saya cuba menambah nama pengarang buku dan genre tetapi apabila saya menyalin kod ia hanya menetapkan atribut produk terakhir. Saya tahu saya mungkin perlu memasukkannya ke dalam gelung, tetapi saya bodoh atau saya tidak dapat mengetahui apa yang saya hilang.
$condition = $_POST['condition']; $genre = $_POST['genre']; $author = $_POST['author']; wp_set_object_terms( $product_id, $condition, 'pa_condition', true ); $att_condition = Array('pa_condition' =>Array( 'name'=>'pa_condition', 'value'=>$condition, 'is_visible' => '1', 'is_taxonomy' => '1' )); update_post_meta( $product_id, '_product_attributes', $att_condition); wp_set_object_terms( $product_id, $genre, 'pa_genre', true ); $att_condition = Array('pa_genre' =>Array( 'name'=>'pa_genre', 'value'=>$genre, 'is_visible' => '1', 'is_taxonomy' => '1' )); update_post_meta( $product_id, '_product_attributes', $att_genre); wp_set_object_terms( $product_id, $author, 'pa_author', true ); $att_author = Array('pa_author' =>Array( 'name'=>'pa_author', 'value'=>$author, 'is_visible' => '1', 'is_taxonomy' => '1' )); update_post_meta( $product_id, '_product_attributes', $att_author);
Gembira anda menemui penyelesaian. Walau bagaimanapun, soalan soalan asal belum dijawab, dan terdapat pepijat mudah dalam penyelesaian anda yang perlu diperbaiki.
Berbalik kepada soalan asal.
Terdapat pelbagai isu dengan kod asal anda.
Penamaan dan penggunaan pembolehubah dalam kod anda mengandungi ralat. Kali kedua anda memanggil update_post_meta; anda menetapkan pembolehubah $att_condition tetapi menggunakan att-genre. Betulkan ini jika anda ingin menggunakan 3 pembolehubah. Walau bagaimanapun, kod itu masih tidak berfungsi.
Anda memanggil update_post_meta 3 kali (dengan andaian pembetulan untuk isu pertama) pada kekunci meta yang sama _product_attributes untuk 3 pembolehubah berbeza ($att_condition, $att_genre, $att_author). update_post_meta akan menimpa nilai meta_key jika ditemui dan berbeza daripada nilai yang diluluskan. Walaupun anda telah menetapkan nilai tatasusunan kepada pembolehubah, semuanya berbeza dan hanya satu rekod tatasusunan disimpan. Oleh itu, panggilan terakhir untuk update_post_meta akan menimpa tulisan sebelumnya. Sebaliknya, anda ingin menetapkan semua data tatasusunan atribut kepada pembolehubah tatasusunan tunggal dan kemudian buat satu panggilan ke update_post_meta. Ia kemudian akan mengemas kini dengan betul dengan semua sifat yang anda tambahkan.
Ini akan membawa anda kepada penyelesaian gaya foreach yang lebih mantap dan boleh disokong.
Masalah mudah yang anda hadapi dengan penyelesaian anda ialah isu prestasi. Anda telah memasukkan
Di dalam gelung foreach bukan di luarnya. Jadi buat masa ini ia masih menulis ke pangkalan data sebanyak 3 kali melalui update_post_meta dan secara beransur-ansur meningkatkan beban apabila ia berulang pada tatasusunan input dan membina $thedata.
Penyelesaian: Alihkan panggilan update_post_meta selepas foreach supaya ia hanya membuat satu panggilan bagi setiap pelaksanaan.
Akhir sekali, selesaikan panggilan ini dan mungkin juga sertakan tugasan awal anda kepada $my_product_attributes atau gunakan $value berkenaan pemulaan nilai nol dan pengendalian dalam mana-mana logik bersyarat berkaitan yang anda rasa sesuai dengan keperluan anda.
Saya menemui penyelesaiannya di https://stackoverflow.com/a/45475863/12092133.
Saya meletakkan pembolehubah bentuk ke dalam tatasusunan dan kemudian menjalankan foreach ini dan ia berjaya.