WordPress Sql Cache Yöntemi
Merhaba arkadaşlar. Anlatacağım bu yöntem sayesinde birçok arkadaşın muzdarip olduğu fazla sorgu sayısından kurtulacaksınız. Bu sayede blogunuzun açılış hızı da artmış olacak. Öncelikle bu yöntem Selçuk Kılıç‘a aittir. Benim anlatmamın sebebi ufak birkaç değişiklik ve biraz daha yalın bir dille anlatmamdır.
Eğer bu yöntemi kullanırsanız W3 Total Cache, WP Super Cache gibi eklentileri kullanmanıza gerek kalmaz. Blogunuzda ne kadar sorgu olursa olsun, bu yöntem sayesinde tüm sorgular sadece 2 sorguya indiriliyor.
Öncelikle tema dosyamızın içerisine sqlcache adında bir klasör açalım. Buraya cache belleğe alınmış kodların bulunduğu dosyaları atacağız. Şimdi asıl anlatıma geçebiliriz.
Kod kalıbımız aşağıdaki gibidir.
$cache_ismi = "sidebarcache"; $cache_zamani = 60 * 10; // 60*10=600 buda 10 dakikaya esittir heralde :) // Cache varmi yokmu kontrolunu yaptiriyoruz. eger yoksa sorgu yaptirip, ciktiyi DBye kaydeiyoruz. if(false === get_transient($cache_ismi)){ ob_start(); /******* Cache Alinacak sorgular, kodlar v.s... *******/ // Burda ciktiyi DB ye kaydediyoruz.. set_transient($cache_ismi, ob_get_contents(), $cache_zamani); ob_end_flush(); // Eger cache varsa DBden bilgileri cekip ekrana yazdiriyoruz. }else{ // Echo ile DBdeki cache bilgilerini ekrana yazdiriyoruz. echo get_transient($cache_ismi); }
Selçuk Kılıç yardımcı kodlarla kalıbımızı çok güzel açıklamış. Zaten burada değiştirmeniz gereken 2 kısım var. Bunlardan ilki 1. satırdaki $cache_ismi yazan değişken. Şuan bu değişkene sidebarcache değeri atanmış. Siz bunu isteğinize göre değiştirebilirsiniz. Unutmayın, her cache belleğe alınacak kod yığını için farklı cache ismi girmelisiniz. Değiştirmeniz gereken ikinci kısım ise 2. satırdaki cache zamanı. Aslında bunu değiştirmeseniz de olur.
Peki kalıbımız bu fakat biz bunu nasıl kullanacağız? Hemen onu da anlatayım. Mesela benim aşağıdaki şekilde bir kod yığınım var diyelim.
<h3><?php echo get_option('er_yan_thumb_baslik'); ?></h3> <?php $usluer = new WP_Query("showposts=".get_option('er_yan_thumb_kac')."&cat=".get_option('er_yan_thumb_kat').""); while($usluer->have_posts()) : $usluer->the_post(); ?> <?php $image_url = wp_get_attachment_image_src( get_post_thumbnail_id(), 'full'); if ( has_post_thumbnail() ) { ?> <div class="thumb3"> <a href="<?php the_permalink() ?>" title=""> <span class="ballon" onmouseover="tooltip.show('<?php the_title(); ?><br />Okunma: <?php if(function_exists('the_views')) { the_views(); } ?>');" onmouseout="tooltip.hide(); "><img src="<?php bloginfo('template_url'); ?>/scripts/timthumb.php?src=<?php echo $image_url[0]; ?>&w=60&h=53&zc=1" alt="<?php the_title(); ?>" /></span> </a> </div> <?php } ?> <?php endwhile; ?>
Atıyorum ben bu kodları kullandığım zaman bloguma ekstradan 20 sorgu çıkartıyor. Bu kodlara sql cache yöntemi uygulayalım.
<?php $cache_ismi = "yanthumb"; $cache_zamani = 60 * 10; // 60*10=600 buda 10 dakikaya esittir heralde :) // Cache varmi yokmu kontrolunu yaptiriyoruz. eger yoksa sorgu yaptirip, ciktiyi DBye kaydeiyoruz. if(false === get_transient($cache_ismi)){ ob_start(); ?> <h3><?php echo get_option('er_yan_thumb_baslik'); ?></h3> <?php $usluer = new WP_Query("showposts=".get_option('er_yan_thumb_kac')."&cat=".get_option('er_yan_thumb_kat').""); while($usluer->have_posts()) : $usluer->the_post(); ?> <?php $image_url = wp_get_attachment_image_src( get_post_thumbnail_id(), 'full'); if ( has_post_thumbnail() ) { ?> <div class="thumb3"> <a href="<?php the_permalink() ?>" title=""> <span class="ballon" onmouseover="tooltip.show('<?php the_title(); ?><br />Okunma: <?php if(function_exists('the_views')) { the_views(); } ?>');" onmouseout="tooltip.hide(); "><img src="<?php bloginfo('template_url'); ?>/scripts/timthumb.php?src=<?php echo $image_url[0]; ?>&w=60&h=53&zc=1" alt="<?php the_title(); ?>" /></span> </a> </div> <?php } ?> <?php endwhile; ?> <?php // Burda ciktiyi DB ye kaydediyoruz.. set_transient($cache_ismi, ob_get_contents(), $cache_zamani); ob_end_flush(); // Eger cache varsa DBden bilgileri cekip ekrana yazdiriyoruz. }else{ // Echo ile DBdeki cache bilgilerini ekrana yazdiriyoruz. echo get_transient($cache_ismi); } ?>
Bu şekilde bir dosya oluşturdum ve adını da yanthumb.php yaptım. Gördüğünüz gibi cache ismini de kendime göre düzenledim. Ardından kaydettiğim bu dosyayı ilk başta oluşturduğumuz sqlcache isimli klasöre atıyorum. Son olarak da bu dosyayı kullanacağımız yere çekmek kaldı. Onun için de aşağıdaki kodu cache belleğe aldığım kodların yerine yazıyorum.
<?php include('sqlcache/yanthumb.php') ?>
Buraya kadar her şey tamam. Sql cache yöntemi başarı ile bitirdik fakat bir şey eksik. Cache belleğe alınan veriler nasıl sıfırlanacak? Onun içinde Selçuk Kılıç şöyle bir şey düşünmüş; yazı eklendiğinde, güncellendiğinde veya silindiğinde cache bellekteki veriler sıfırlansın. Bunun içinde functions.php dosyamızı açıyoruz ve aşağıdaki kodu buluyoruz.
<?php
Bu kodun hemen altına aşağıdaki kodları ekliyoruz.
function usluer_cache_sil(){ delete_transient( 'CACHE1' ); delete_transient( 'CACHE2' ); delete_transient( 'sidebarCACHE' ); } add_action('publish_post', 'usluer_cache_sil'); add_action('update_post', 'usluer_cache_sil'); add_action('delete_post', 'usluer_cache_sil');
Buradaki CACHE1, CACHE2 ve sidebarCACHE yazan yerler sizin cache belleğe aldığınız kodlara vermiş olduğunuz isimler. Kısacası cache isimleri. Bu yerleri kendinize göre düzenlemelisiniz.
Hepsi bu kadar. Bu yöntem sayesinde büyük bir dertten kurtulmuş oluyoruz.
Selçuk Kılıç‘a teşekkür ederiz.
Anlatım ve paylaşım güzel
İsmail abi yine bomba gibi paylaşım yapmışsın aklımda olan birşeydi.
bu konuda benim kendi sitemde yapabilecek arkadaş arıyorum ben profesyonel olmadıgım için yapacak biri aranıyor şuanda wp super cache kurulmuş yanlız
hocam paylaşımın için teşekkürler ancak bunu komple site için yapamazmıyım acaba yani örneğin index.php deki tüm kodları aldığımda anlattığınız gibi yapıp komple index.php deki kodları atıyorum ama hata veriyo . dediğim gibi yapma şanşımız varmı yoksa bazı kodlarımı bu şekilde yapabiliyoruz
Komple yapmanız pek sağlıklı olmaz ama yapılabilir mi hiç denemedim.
Elinde sağlık abi çok güzel anlatmışsın.
Anlatım gayet güzel olmuş fakat kısmi cache yöntemi olduğu için sitenin tamamını cachelemek için yetersiz kalacaktır. Ama bu mantığı kullanarak kendimizin yazdığı uygulamalarda cacheleme yapabiliriz.
merhaba sorum şu hem bu cacheleme sistemini gereken yerlere uygulasak hemde wp-super cache kullansak ne gibi bir zararı veya yararı olurmu ve ikisini birlikte kullanmak uygunmu ? Lütfen soruma cevap yazarmısınız.
Eklenti kullanıyorsanız bu sistemi kullanmaya gerek yok.
Anladığım kadarıyla sadece sorguları tampon belleğe alıyor, W3 Total Cache ya da Super Cache gibi sayfaları statik HTML durumuna getirmiyor.
Aynen dediğiniz gibi yapıyor.
sitem hazır bir tema php ile yazılmış benim kod yazma bilgim yok ancak sitede 85 sorgu var bu sebepten dolayı site çok yavaş açılıyor ve kitleme yapıyor ne yapabilirim bu sistemi php içinde kullanabilirmiyiz
Tam olarak kullanılıp kullanılmayacağını bilmiyorum.
teşekkürler benim sorunum ile ilgili bir fikriniz varmı sitedeki sorgu sayısından dolayı site kitleniyor ne yaabilirim sizce
Bu işlerle uğraşan arkadaşlar var. Onlarla irtibat kurun derim. WordPress dışında olduğu için bir şey söyleyemeyeceğim.
ben ilginç bir sual sormak istiyorum =)
Bu cache yöntemini
Günde 400 tane yazı girilen bir haber sitesini
parçalara ayırarak dahi uygulasak
delete_transient komutu
Tüm post, page, menu ve post tipleri için sabit çalıştığından
herhangi bir post eklendiğinde tüm sorguları resetleyecek gibi görünüyor.
sadece ve sadece o cache ait olan bölümü etkileyen postlar için
delete cache yaptırmak mümkün mü?
Daha doğrusu
add_action(‘publish_post’, ‘usluer_cache_sil’);
komutunu örnek veriyorum şu şekilde geliştirebiliyormuyuz.
Örneğin :
Publish,update veya delete post durumunda eğer publish edilen post
xxx meta keyinde – xxx meta valuesine sahipse veya
xxx kategorisine eklendi ise
xxx sayfa templatesi ile eklendiyse
xxx menü adına sahipse gibi
kısıtlamalar yapabilirmiyiz ?
hocam özgün olucam diye anlaşılcak dilde yazmamışsın kötü buldum yazını içeriği güzel fakat yazı stilin kötü düzeltmelisin.