12
2013
Taslak Yazılar Otomatik Yayınlansın (Draft to Publish Benzeri)
WordPress'te yazıları otomatik olarak yayınlamak için normalde Yazı Zamanlama sistemi kullanılır. Yani yayımlama tarihi olarak ileri bir tarih verdiğinizde yazı o tarih ve saat geldiğinde yayınlanır. Ancak bazen bununla uğraşmak zaman olabilir. Bu durumda yazıyı taslak olarak kaydetsek ve belirlediğimiz bir zaman aralığında (örneğin her 120 dakikada bir) otomatik yayınlansa iyi olmaz mı?
Normalde bunun için yazılmış Draft to Publish eklentisi var. Ancak bu eklentiyi kullanmak yerine functions.php dosyasına ekleyeceğimiz bir kod ile bunu yapabiliriz.
Aşağıdaki kodu temanızın functions.php dosyasına uygun şekilde ekleyin. Kod içerisindeki $parametreler bölümündeki parametreleri kendinize göre değiştirin.
function yakuphoca_draft_to_publish(){ $ensonyayin = get_option('yakuphoca_draf2publish'); if (!$ensonyayin) { $ensonyayin=time();update_option('yakuphoca_draf2publish', $ensonyayin);} if ( (time() - $ensonyayin) > (60 * 3) ) { $ensonyayin = time(); update_option('yakuphoca_draf2publish', $ensonyayin); $parametreler = array( 'category' => '', 'post_type' => 'post', 'post_status' => 'draft', 'posts_per_page' => 1, 'orderby' =>'post_date', 'order' => 'ASC' ); $yazilar = get_posts($parametreler); if ($yazilar) { foreach( $yazilar as $yazi ) { $yayinparametreleri = array('ID' => $yazi->ID, 'post_status' => 'publish', 'post_date' => current_time('mysql'), 'post_date_gmt' => current_time('mysql', 1)); wp_update_post($yayinparametreleri); } } } } yakuphoca_draft_to_publish();
Kodlardaki 60 * 10 ifadesi yazıların yayınlanacağı aralığı belirtiyor. 10 yerine dakika cinsinden kaç dakikada bir yazıların yayınlanmasını istiyorsanız onu yazın. Örneğin 90 dakikada bir yayınlansın istiyorsanız 60 * 90 yazın. Eğer 24 saatte bir yayınlansın istiyorsanız 60 * 60 * 24 yazın oraya.
$parametreler değişkeni, ne tür yazıların yayınlanacağını belirtir. Kod içerisinde parametrelerin açıklamaları var. Açıklamalara göre gerekli değişiklikleri yaparak istediğiniz kategoride, istediğiniz türde ve sayıda yazıyı yayımlayabilirsiniz.
Önemli Açıklama
Değerli arkadaşlar WordPress içerisinde gerçek bir cron job (zamanlanmış iş) metodu bulunmamaktadır. Bu nedenle sitelerimizdeki zamanlanmış yazılar olsun, burada verdiğimiz koddaki zamanlama mekanizması olsun, çalışabilmeleri sitenin yenilenmesi yani bir ziyaretçinin siteyi açıp, bir sayfayı tarayıcısıyla incelemesi gerekmektedir.
Bu nedenle kod içerisindeki süreyi 10 dakika yapmış olmanız demek, her 10 dakikada bir yazı yayınlanacağı anlamına gelmemektedir. Buradaki zamanlamanın anlamı 10 dakika geçecek ve bir ziyaretçi siteye geldiğinde yayınlanacak anlamına gelmektedir. Eğer 10 dakika geçip, ilk ziyaretçi 30 dakika sonra gelirse yazı ziyaretçi geldiğinde yayınlanacaktır. Yani 10 dakika sonra değil, toplamda 40 dakika sonra yayınlanmış olacaktır. Kısaca koddaki zamanlamanın anlamı en az 10 dakikada bir yazı yayınlanacaktır.
Örnek Uygulamalar
Aşağıda parametrelerin farklı kullanımıyla ilgili örnekler gösterilmektedir. Kendinize uygun olanı alıp, kullanabilirsiniz.
Belirli Kategorideki Taslaklar Yayınlansın
Bunun için parametrelerdeki category değerini değiştireceğiz. Örneğin 5 ID'li kategoridekileri yazılar için koddaki parametreleri aşağıdaki gibi değiştirin.
$parametreler = array( 'category' => '5', //Yazının alınacağı kategori ID 'post_type' => 'post', //Yazının türü post=yazı 'post_status' => 'draft', //draft=Taslak, pending=İnceleme bekliyor 'posts_per_page' => 1, //Kaç yazı yayınlansın 'orderby' =>'post_date', //Sıralama şekli post_date tarihe göre, rand=rastgele 'order' => 'ASC' //Artan sırada, eskiden yeniye; azdan çoğa );
Kategori ID'leri 8 ve 27 olan iki kategoriden herhangi birinden olan yazıları yayımlasın.
$parametreler = array( 'category' => '8, 27', //Yazının alınacağı kategori ID 'post_type' => 'post', //Yazının türü post=yazı 'post_status' => 'draft', //draft=Taslak, pending=İnceleme bekliyor 'posts_per_page' => 1, //Kaç yazı yayınlansın 'orderby' =>'post_date', //Sıralama şekli post_date tarihe göre, rand=rastgele 'order' => 'ASC' //Artan sırada, eskiden yeniye; azdan çoğa );
Rastgele X Sayıda Yazıyı Yayınlamak
Rastgele yazılar yayınlamak için orderby değerini, yazı sayısını belirlemek için posts_per_page değerini değiştirmek gerekir. Örneğin rastgele 5 yazıyı, süre sonunda topluca yayınlamak için.
$parametreler = array( 'category' => '', //Yazının alınacağı kategori ID 'post_type' => 'post', //Yazının türü post=yazı 'post_status' => 'draft', //draft=Taslak, pending=İnceleme bekliyor 'posts_per_page' => 5, //Kaç yazı yayınlansın 'orderby' =>'rand', //Sıralama şekli post_date tarihe göre, rand=rastgele 'order' => 'ASC' //Artan sırada, eskiden yeniye; azdan çoğa );
Taslak Değil, İnceleme Bekliyor Türündeki Yazıları Yayınlamak
Yazı türünü değiştirmek için post_status değeri değiştirilir. Tür olarak pending (inceleme bekliyor), future (zamanlanmış), publish (yayınlanmış) değerlerini yazabilirsiniz. İnceleme bekleyen yazılardan yazı yayınlamak isterseniz, aşağıdaki gibi parametreleri düzenleyin.
$parametreler = array( 'category' => '', //Yazının alınacağı kategori ID 'post_type' => 'post', //Yazının türü post=yazı 'post_status' => 'pending', //draft=Taslak, pending=İnceleme bekliyor 'posts_per_page' => 1, //Kaç yazı yayınlansın 'orderby' =>'post_date', //Sıralama şekli post_date tarihe göre, rand=rastgele 'order' => 'ASC' //Artan sırada, eskiden yeniye; azdan çoğa );
Belki yayınlanmış yazıları bir daha yayınlamak isterseniz bu durumda aşağıdaki parametreleri kullanabilirsiniz.
$parametreler = array( 'category' => '8, 27', //Yazının alınacağı kategori ID 'post_type' => 'post', //Yazının türü post=yazı 'post_status' => 'publish', //draft=Taslak, pending=İnceleme bekliyor 'posts_per_page' => 1, //Kaç yazı yayınlansın 'orderby' =>'post_date', //Sıralama şekli post_date tarihe göre, rand=rastgele 'order' => 'ASC' //Artan sırada, eskiden yeniye; azdan çoğa );
Parametrelerin kullanımlarıyla ilgili örnekler şimdilik bunlar, parametrelerin mantığını örnekleri inceleyerek çözerseniz, istediğiniz gibi değiştirip, istediğiniz kombinasyonlarda yazılarınızı yayımlayabilirsiniz.
üstadım bu fonksiyonda son yazıdan x dakika sonra diğerini yayınlama gibi bir durum mevcut mu?
Zaten dediğiniz gibi oluyor, bir yazı yayınlandıktan x dakika sonra varsa diğer taslak yazı yayınlanıyor. Yazıda da bahsettiği gibi 60 * 3 yerine 60 * 10 yazarsanız, bir yazı yayınlandıktan en az 10 dakika sonra diğerini yayınlar. Yazı içerisindeki açıklamaları lütfen dikkatli okuyalım.
Peki iframe kodlarını siliyor mu yayınlarken? malum wp de bir kaç değişiklikle zamanlanmış yazılarda iframe yayınlayabiliyoruz.
Eklenti iframe vs. gibi kodlar üzerinde işlem yapmamaktadır, sadece yazıyı draft (taslak) durumundan publish (yayınlanma) durumuna getirmektedir.
Bunu yaparken wp_update_post fonksiyonunu kullanır. Bu fonksiyon kendisine verilen değerleri alıp, wp_insert_post fonksiyonuna güncelleme yapılmasını söyleyerek gönderir. wp_insert_post fonksiyonu normalde yeni bir yazı eklemek için kullanılan bir fonksiyondur, ancak güncelleme işlemlerini yerine getirir.
Fonksiyon içerisinde yazıdaki bilgiler filtreden geçirilmektedir, ancak yapılan işlem, sizin bir yazıyı yazıp, yayınlamanızdan farklı değildir.
Iframe meselesinde ise WordPress normalde bu etikete izin vermez ancak shortcode kullanarak ya da bazı mekanizmaları örneğin pre_post_update kancasına bir fonksiyon bağlanarak iframe eklenebilir.
Sizin iframe yönteminizi görmeden ne yazık ki kesin bir bilgi vermem mümkün değil.
Benim temada nasıl bir sorun varsa henüz çözmüş değilim, functions.php ye eklenenleri görmüyor. Neden böyle yapar sizce?
Functions.php'ye eklenenleri görmemesi mümkün değil.
Dosya şifreli değilse, bir yerde açık tırnak bırakılmamışsa, <?php ve ?> kodları doğru yerlerde açılıp, kapatılmışsa functions.php de sorun olmaması lazım.
Doğru temanın içindeki functions.php'yi düzenlediğinizden emin olun, dosya içerisinde bir kod ya da bir eklenti ya da temadan kaynaklanan bir şey dosyanın yüklenmesini engelliyor olabilir. Eğer varsayılan temaya dönüp, kodları denediğinizde çalışıyorsa, demek ki sorun temanızda eğer yine çalışmazsa, bu durumda eklentileri kontrol etmek gerekir.
Functions.php dosyanıza basit bir kod ekleyerek önce gerçekten dosyanın işletilmediğinden emin olabilirsiniz. Örneğinn aşağıdaki kod yazıların sonuna Merhaba Televole yazılmasını sağlar.
add_action("the_content, "merhaba_televole");
function merhaba_televole($content) {
$content .= "
Merhaba Televole
";
return $content;
}
Bu kodu doğru temanın functions.php dosyasına eklediğinizden emin olduktan sitenizdeki yazıların sonuna bir bakın, ekleme yapılmış mı?
Yakup hocam bilgi birikimini insanlarla paylaşman çok hoşuma gidiyor. Takip ediyorum seni, her paylaşımında yeni şeyler öğreniyorum. Allah razı olsun.
test ettim ayrıca,
Parse error: syntax error, unexpected T_VARIABLE in
diye de bir hata veriyor belirtmek isterim.
Hata veren satırdaki kodları eklemeniz mümkün mü? Kontrol ettiğimde bir hata göremedim, acaba değişiklik yaparken bir yanlışlık yapmış olabilir misiniz?
Kodlar benim localde kullandığım kodların kopyalanıp, yapıştırılmış halidir.
Mehmet Bey,
Yaptığım incelemede problemin, kodları göstermek için kullandığım syntaxhighlighter eklentisinden kaynaklandığını farkettim. Ayarlarını değiştirip, eski versiyonu kullanmasını sağlayarak problemi çözdüm. Şimdi kodları kopyalayıp, yapıştırırsanız sorunsuz çalışacağını düşünüyorum.
Problemin kaynağı şu, eklenti syntaxhighlighter isimli bir jquery eklentisini kullanıyor. Bu eklentinin 3.0 versiyonunda nedendir bilmem satırlar içindeki boşlukları garip, normalde görünmeyen bir karaktere dönüştürüyor. Verdiğim kodları kopyalayıp, UTF-8 kodlu bir metin dosyasına yapıştırdığınızda kodda bir gariplik görünmüyor ama çalıştırdığınızda yazdığınız hataya neden oluyor. Dosyanın dilini ANSI formatına çevirdiğinizde de boşluklar garip bir A harfi şeklinde görünüyor. Sanırım bir bug var. Çözümünü bulmaya çalışacağım, ama o zamana kadar eklentinin eski sürümünü kullanıp, üzerine geldiğinizde çıkan düğmelerden ilkine tıklayıp, seç/kopyala/yapıştır yolunu kullanacaksınız.
Problem için geri bildirimde bulunduğunuz için ayrıca teşekkür ederim.
Hocam yorum yazdıktan sonra kodları farklı bir sitemde daha denedim. Sorunsuzca çalıştı.
Sebebini bilemiyorum. Yukarıda arkadaşlar bazı kodları sildiğini belirtmişler. Ben de şöyle bir şey farkettim. Bir biyografi yazısında başlık var içerik yok sitede. Yazıyı düzenleme alanından baktığımda ise yazı yerinde duruyor. Güncelliyorum ama yine görünmüyordu.
Daha sonra dikkat ettim, yazıyı ben farklı bir yerden kopyalamıştım ve div içerisinde idi. "div"leri silince yazı artık sitede gözükmeye başladı.
Bu kodlama yüzünden midir değil midir bilemiyorum, o kadar teknik bilgim yok.
Yardımlarınızdan ve fonksiyonel çözümleriniz için ben teşekkür ederim
normalde zamanlanmış görevde iframe, embed gibi kodlar yayınlanıyor. ancak bu eklentiyle yayınlananlarda bu içerik siliniyor. sebebi ve çözümü nedir?
Yaptığım denemelerde bahsettiğiniz şekilde bir sorun yaşamadım. Acaba yazılarınızı eklerken kullandığınız kullanıcı editör ya da daha aşağı yetkilere sahip olan bir kullanıcı olabilir mi? Mümkünse yazıları eklerken yönetici yetkisi olan bir kullanıcıyı kullanırsanız iyi olur.
yetki sıkıntısı olmayan hesaplardan yapıyorum bunları.
object , iframe vs.. kodlar ise yayınlanma sırasında siliniyor.
ör:
gibi bir yazıdan eklenti ile yayınlama sırasında kalan;
şeklinde oluyor. iframe kısmı siliniyor. bu içerik content kısmına girilen içerik. özel alanlara girilenler değil.
üstad fonksiyon her seferinde 2 yazı yayınlıyor.
Normalde bir tane yayınlaması gerekiyor. Eğer kod içindeki 'posts_per_page' => 1 ifadesini 'posts_per_page' => 2 olarak değiştirmediyseniz, kodu güncelledim yeni kodu kullanın.
Kodun işleyişi şu şekilde, $ensonyayin adlı değişken taslak yazının yayınlandığı en son zamanı veritabanından alıyor, şimdiki zaman ile karşılaştırıyor, eğer aradaki fark belirtilen süre kadar ya da fazlaysa verilen parametrelere göre yazı ya da yazıları alıp, taslak durumundan yayınlanmış durumuna getiriyor. Değilse bir şey yapmıyor.
Bu kod ziyaretçilerin sitede her sayfa açtıklarında çalışıyor, dolayısıyla yoğun olan sitelerde küçük bir ihtimal de olsa aynı anda iki kişi bir sayfayı yenilerse, birinci kişi sayfayı açtığında yazı şart sağlanıp, yazı yayınlanana kadar geçen sürede diğer kişi de süreci başlatabilir. Ancak dediğim gibi bu ihtimal çok küçük bir ihtimal çünkü burada milisaniyelik sürelerden bahsediyoruz.
Kodu localde ve demo sitemde denediğimde iki tane yazıyı yayınlama durumu olmamıştı.
Şimdi aklıma geldi, belki kullandığınız cache (önbellek) eklentisi böyle bir probleme neden oluyor olabilir. Yani aslında bir yazı yayınlanıyordur ama eklenti bunu göstermiyordur, sonraki yazı yayınlandığında eklentinin önbellek süresi doluyor ve iki yazıyı da sanki yeni yayınlanmış gibi gösteriyor olabilir, bu da aslında bir ihtimal.
üstadım yazıları hep 2 adet yayınlıyor. arada tek yayınlıyor ama genelinde 2 yazı art arda yayınlıyor.
sürekli sayfa refresh ediliyor yayınlasın diye. yani ziyaretçi sıkıntısıda yok.
hatta şimdide taslakta olan 3 yazıyıda aynı anda yayına soktu.
evet arada tek yazıda yayına sokuyor. ancak genelde hep 2 yazı yayınlıyor. az öncede taslaktaki 3 yazıyı birden yayına soktu. en son yayın süresindede post per page dede sıkıntı yok. yani post per 1. değiştirmedim hiç. sadece süreyi 360 dk olarak ayarladım. ve random olarak yayınlatıyorum.
Ön belleklemeyi kapatıp yeni kod ile değiştireyim üstadım. gerçi ana sayfada önbellekleme yok.