Plugin toko online WordPress segar

Beberapa waktu yang lalu saya perlu membuat toko online di WordPress. Ada banyak solusi bagus di repositori resmi. Di antara mereka, pemimpin - Woocommerce telah lama menonjol. Saya pikir dia tidak perlu diperkenalkan. Pasukan jutaan pengguna, ratusan ekstensi berbayar dan gratis, serta fleksibilitas luar biasa. Inilah sebabnya mengapa Woocommerce memiliki lebih dari 5 juta instalasi aktif dan mencakup sebagian besar toko online di seluruh dunia.

Namun, saya memutuskan untuk menciptakan sepeda saya. Sebagian untuk memompa keterampilan, sebagian untuk mencoba membuat plugin e-niaga yang tidak membutuhkan banyak sumber daya dan cukup cepat. Saya baru-baru ini mempostingnya di repositori resmi , oleh karena itu, saya mengundang semua orang untuk mengujinya. Dalam artikel ini saya tidak akan melakukan tinjauan kemungkinan, tetapi saya hanya akan berbicara tentang beberapa solusi teknis yang menarik.



Permalinks Problem


Secara umum, permalinks di WordPress adalah salah satu situs yang paling sulit, karena mereka memerlukan penyelesaian sejumlah masalah koneksi dan dependensi. WpStore memiliki kemampuan untuk mengelola permalink. Misalnya, Anda dapat menghapus siput product dari url product , ubah ke slug Anda atau tambahkan kategori siput atau bahkan kategori yang bersarang. Tautan ke produk mungkin terlihat seperti ini: ./-/---/---/-/ . Tidak buruk.

Saya harus banyak berkeringat untuk mendapatkan kategori bersarang. Menggunakan fungsi wp_get_object_terms, kami mendapatkan kategori produk yang ditentukan, dan kemudian dalam siklus kami mengumpulkan kelemahan dan membentuk url sesuai dengan hierarki dari induk ke anak. Untuk menampilkan tautan yang diperlukan, kami menggunakan filter post_link. Ini hanya sebagian dari kode (Anda dapat melihat kode lengkap di sumber):

 add_filter( 'post_link', 'wpsl_post_type_permalink', 20, 3 ); add_filter( 'post_type_link', 'wpsl_post_type_permalink', 20, 3 ); function wpsl_post_type_permalink( $permalink, $post_id, $leavename ) { .... /** * Works only in the admin panel when changing the structure of permanent links or creating/updating the product * In the frontend to display links to products using $post->guid * Relevant if the structure of permalinks are used %category% or %categories% */ if ( is_admin() ) { // get all terms (product categories) of this post (product) by hierarchicaly // change %category% if ( strpos( get_option( 'product_permalink' ), '%category%' ) !== false && $terms = wpsl_get_terms_hierarchicaly( $post->ID, 'product_cat' ) ) { $custom_slug = str_replace( '%category%', isset( $terms[0] ) && is_object( $terms[0] ) ? $terms[0]->slug : '', $custom_slug ); } // change %categories% if ( strpos( get_option( 'product_permalink' ), '%categories%' ) !== false && $terms = wpsl_get_terms_hierarchicaly( $post->ID, 'product_cat' ) ) { foreach( $terms as $term ) { $hierarchical_slugs[] = $term->slug; } $custom_slug = str_replace( '%categories%', implode( '/', $hierarchical_slugs ), $custom_slug ); } else { $custom_slug = str_replace( '%categories%', 'product', $custom_slug ); } } .... return $permalink; } 

Tetapi pada titik ini, masalah kinerja muncul. Situs mulai bekerja lebih lambat, terutama pada halaman keluaran beberapa produk. Misalnya, pada halaman kategori dengan output hanya 16 produk, hampir 90 pertanyaan dibuat ke database dan waktu respons server meningkat secara dramatis sekitar 25-30%.

Ternyata ketika memanggil fungsi the_permalink, WordPress melakukan banyak operasi: itu mendapatkan jenis CNC dan mengumpulkan data posting tergantung pada jenis ini. Untuk menampilkan 1 tautan, WordPress menghasilkan beberapa permintaan yang tidak di-cache ke basis data. Selain itu, proses memperoleh taksonomi dan hierarki barang bukanlah yang tercepat.

Karena pembuatan tautan yang konstan tidak sesuai dengan kita, masuk akal untuk menyimpannya di suatu tempat lalu menariknya dari sana. Diputuskan untuk menggunakan bidang guid khusus pada tabel guid . Meskipun pengembang WP tidak merekomendasikan untuk mengubahnya, kami masih dapat mengabaikan peringatan ini karena beberapa alasan:

  • guid digunakan untuk menghasilkan RSS, dan beberapa orang menggunakannya.
  • hanya entri yang ditampilkan dalam RSS, dan jenis posting kami adalah produk.

Untuk menjaga tautan di database dengan benar, kami save_post menggantung fungsi save_post acara yang memperbarui bidang panduan:

 add_action( 'save_post', 'wpsl_guid_rewrite', 100 ); function wpsl_guid_rewrite( $id ) { if( !is_admin() ) return; if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return false; if ( strpos( get_option( 'product_permalink' ), '%category%' ) !== false || strpos( get_option( 'product_permalink' ), '%categories%' ) !== false ) { if( $id && get_post_type( (int)$id ) == 'product' ){ global $wpdb; $wpdb->update( $wpdb->posts, [ 'guid' => ( get_permalink( $id ) ) ], [ 'ID' => intval( $id ) ] ); } clean_post_cache( $id ); } } 

Tetap bagi kami untuk mencegat output tautan pada hook post_type_link dan menampilkan tautan yang dihasilkan:

 add_filter( 'post_type_link', 'wpsl_get_permalink_change', 10, 4 ); function wpsl_get_permalink_change( $post_link, $post, $leavename, $sample ){ if ( isset( $post->guid ) && $post->guid && $post->post_type == 'product' && ( strpos( get_option( 'product_permalink' ), '%category%' ) !== false || strpos( get_option( 'product_permalink' ), '%categories%' ) !== false ) ) { return $post->guid; } return $post_link; } 

Di sini kita memeriksa kelengkapan bidang panduan, jenis posting dan jenis CNC. Jika nilai dari ketiga parameter sesuai dengan kami, tampilkan tautan yang disimpan sebelumnya.

Sekarang, bagian terbaiknya adalah: lihat hasilnya. Jumlah kueri ke database berkurang hampir 2 kali - dari hampir 90 menjadi 44! Dan waktu respons server pada pengujian hosting turun menjadi 0,24 detik yang dapat diterima.

Memperbarui bidang panduan terjadi tidak hanya selama pembuatan dan pengeditan barang. Plug-in memiliki sistem bawaan untuk mengimpor barang melalui csv, sehingga pembaruan juga terjadi ketika impor selesai.

Perbarui: dokumentasi plugin

Source: https://habr.com/ru/post/id467937/


All Articles