Büyük Bir Mağazada Yavaş WooCommerce Araması? Bu Ücretsiz Çözümle %867'ye Varan Hız Artışı Sağlayın
Son zamanlarda, çok sayıda siparişi işleyen e-ticaret sitelerinde WooCommerce aramasıyla ilgili bazı ciddi sorunlar yaşadık. Büyük bir yavaşlamaya neden olan belirli bir meta_değer aranırken postmeta tablosunun sorgulanması gerekir. Örneğin, "siparişlerim" bölümünün sorgulanması, sunucu ortamına bağlı olarak 5 saniye veya muhtemelen daha fazla sürebilir. Daha da kötüsü, belirli bir e-postaya veya kişiye ait siparişler için "Siparişler" ekranında arama yapmak 30 saniye veya daha uzun sürebilir (postmeta tablosunda fazladan JOIN'lerin dahil olması nedeniyle).
Yukarıdaki örneklerin her ikisi de yüksek miktarda trafiği olan ve ele alınması gereken bir web sitesi için kabul edilemez.
Mevcut Çözümler ve İlişkili Sınırlamalar
Biraz araştırma yaptıktan sonra, bu sorunların şu anda iki yoldan biriyle ele alındığını gördük:
- ElasticPress eklentisinin yardımıyla ElasticSearch indekslemeyi kullanarak veya
- aynı site veritabanında ikincil bir dizin tablosu kullanma.
ElasticSearch çözümü teoride kulağa hoş geliyor, ancak deneyimlerimiz WordPress ile entegre olmanın iyi bir şey olmadığına inanmamıza neden oluyor. Bunun nedeni, temel WP veri kaynağı (MySQL tablolarıdır) ile ElasticSearch dizinleri arasındaki çok sayıda farklılıktır.
ElasticSearch, kısmi aramaları çok iyi gerçekleştirse ve arama sorgusunda ne yazmak istediğinizi "tahmin etmede" oldukça iyi olsa da, bu iki veri kaynağını entegre etmenin dezavantajları, bu küçük avantajlardan kesinlikle daha ağır basmıyor:
- ElasticSearch örneği ile barındırma sağlayıcınız arasındaki gecikme (PHP ortamınızla aynı sunucuda ElasticPress kuruluysa bunun bir sorun olmayacağını unutmayın, ancak bu, günümüzün yönetilen WordPress barındırma çözümlerinde yaygın bir senaryo değildir) ve
- her sonuçta (tüm sayfalarda) kapsanan siparişlerin sayısı sadece birkaç yüze kadar daraltılmıştır.
Bu durumda, ElasticSearch örneğini sorgulamamız ve ardından eşleşen posta kimliklerini WP_Query'ye aktarmamız gerekir (MySQL'e gönderilen SQL sorgusunun maksimum uzunluğuna bağlı kalarak). Bu, geniş kapsamlı aramalar için iş akışını bozar ve Siparişler ekranında arama yapan mağaza yöneticisine potansiyel olarak yanıltıcı sayıda toplam sonuç sağlayabilir.
Şimdi, ikincil dizin tablosuna. Orijinal çözüm, bize bir WordPress geliştiricisi olan Patrick Garman tarafından sunuldu. Başlangıçta WooCommerce'in "Siparişlerim" bölümünü iyileştirmeyi amaçlamıştı, ancak bunun ihtiyaçlarımız için biraz yetersiz kaldığını düşündük.
Şu anki uygulamasının, WooCommerce 3.0'ın piyasaya sürülmesine ve bunun için planlanan devasa veritabanı yenilemesine kadar geçici bir düzeltme olması gerektiğini biliyoruz (bu, bu yazıda tartıştığımız sorunları çözecektir). Ayrıca, WC 3.0'ın 2017 ortasına kadar piyasaya sürülmeyeceğini biliyoruz ve müşterilerimizi o zamandan önce mutlu etmemiz gerektiğinden, Patrick'in uygulamasını devre dışı bıraktık.
E-Ticaret web sitenizle ilgili yardıma mı ihtiyacınız var? Mitchell ve Saucal ekibini işe alın ve hemen projeniz üzerinde çalışmalarını sağlayın!
Önerilen Çözümümüz
Sipariş dizininin orijinal uygulaması, yalnızca Sipariş Kimliklerini ve Müşteri Kimliklerini ikincil bir tabloda dizinler (Patrick'in düzeltmeyi amaçladığı şey budur). Çözümü, dizinini kullanmak için “Siparişlerim” WP_Query'yi değiştirmek.
Bunu birkaç şekilde genişlettik:
- Müşteri e-postalarını ekledik (hem siparişteki fatura e-postası hem de siparişe atanan müşteriden alınan müşteri e-postası). Yönetici bölümünün siparişler görünümünde bir e-postayı her aradığınızda, postmeta yerine dizin kullanımını tetikleriz.
- Müşteri adlarını ekledik (atanan müşterinin faturalandırma, nakliye ve görünen adı).
Burada bir sorunla karşılaşıyoruz; WooCommerce'in mevcut arama özelliklerini tamamen kaldırmak istemiyoruz, ancak daha hızlı aramalar için dizini koşullu olarak kullanmanın bir yolunu bulmamız gerekiyor. Bunun nedeni, örneğin dizinimizin Adres aramayı desteklememesi ve WooCommerce işlevselliğinin bunu kapsamasıdır.
Bunu başarmak için arama gibi bir parametre ekledik. Arama parametreniz "name:John D" olduğunda, bir joker karakter araması kullanarak John D ile eşleşen adlara sahip tüm siparişleri döndürürüz. WooCommerce'de Sipariş Kimliğini arayabilirsiniz, ancak bunu kolaylaştırabileceğimizi düşündük, bu nedenle çözümümüzle "#1456" arama terimini girip 1456 siparişinin size iade edilmesini sağlayabilirsiniz.
Nasıl Uygulanır
Bu dizini kurmak için tek yapmanız gereken eklenti çatalımızı kurmak ve ardından etkinleştirmek. İşte URL: https://github.com/saucal/wc-customer-order-index
Şu anda tek komplikasyon, ilk dizini oluşturmak için WP-CLI'ye erişmeniz gerekmesidir. Dizini WP-CLI olmadan oluşturmanıza izin verecek bir AJAX arabirimini etkinleştirmeye çalışıyoruz.
Şimdilik eklentiyi etkinleştirdikten sonra sizin için index oluşturmaya başlaması için WP-CLI arayüzünüzü açmanız ve “wp wc_coi reset_index” komutunu girmeniz gerekiyor. Bu işlemin süresi sitenizdeki sipariş sayısına göre değişiklik gösterecektir.
İşler Nasıl Değişti

Bu eklentinin kullanımıyla, müşterilerimizin büyük mağazalarının performansını büyük ölçüde iyileştirebildik. Burada yukarıda, zamanın neredeyse 40 saniyeye kadar çıktığı bir örnek görebilirsiniz. En kötü performans gösteren vakalarımızdan birinde, WP-Admin'de e-posta araması 50 saniyeden fazla sürüyordu.

Bu eklentiyi kullanarak arama süresini 5 saniyenin altına indirdik ve %867 oranında iyileştirdik!
Eşyaları Sarmak
Bir müşterimiz için ElasticSearch çözümünü denedik ve bizim zevkimize göre çok fazla hareketli parçası vardı. WordPress kapsamında kalan ve müşterilerimizin herhangi bir harici hizmete kaydolmasını gerektirmeyen bir şey tercih ediyoruz.
Açık olmak gerekirse, bu bir teknoloji olarak ElasticSearch'ün bir sorunu değildir. Sadece WordPress'in çalışma biçiminden çok farklı olduğu için, ikisini entegre etmek birkaç dezavantaj yarattı ve elde etmeye çalıştığımız şeyi göz önünde bulundurarak bizim için anlaşmaları bozdu. Ek olarak, karmaşık bir üçüncü taraf eklentisine güvenmek zorunda kaldık (10up'ın ElasticPress'i).
Patrick'in yaklaşımını yineledik ve müşterilerimizin en yaygın ihtiyaçlarını karşılayacak şekilde genişlettik. Güvenilir bir WordPress ajansı olarak, birçok veriyi çoğalttığı için bunun en güzel çözüm olmadığını biliyoruz. Müşterilerimize WooCommerce 3.0 yayınlanana ve bu çözümü gereksiz kılana kadar sağlam bir geçici çözüm sağlamak istiyoruz.
Farklı bir şey yapar mıydın? Depomuzda bize bir çekme talebi göndermekten çekinmeyin, alternatifleri görmek isteriz!
Bu makalede bana yardımcı olduğu için baş geliştiricimiz Matias'a beşlik çakın.
E-Ticaret web sitenizle ilgili yardıma mı ihtiyacınız var? Bir sonraki projeniz üzerinde çalışmak için Mitchell ve Saucal ekibini işe alın!
ev borcu WordPress sitesi