Merhaba arkadaşlar şöyle bir gönderide basit bir Widget yapımını anlatmak istedim. Kendim film teması geliştirmekteyim geliştirme sırasında insanların attığı son yorumları ana sayfada gösterirsem insanları yorum atmaya teşvik etmiş olurum düşüncesi ile bir widget yani bileşen yapımına başladım ve baktım çok kısa sürdü ne zamandır da R10 üzerinde bilgilendirici bir gönderi atmak istiyordum dedim R10 üzerinde yazıyım. Umarım forumdan veya ziyaretçi olarak Googleden gelen birilerinin işine yarar. Anlatmaya başlamadan önce insanların zaten genellikle burayı değil kodları okuduğunu bildiğim için yüzeysel bir şekilde hangi fonksiyonun ne yaptığını anlatıp geçeceğim. Eğer bir hata varsa veya öneri varsa benden daha kaliteli insanlar eminim ki bu gönderiye geleceklerdir. Bir önerilerini alırım

Öncelikle WordPresse haber veriyoruz. İlk satırımız aşağıdaki gibi olacak burada widgeti functions dosyasında çağırmadan önce özel bir class ismi belirtiyoruz ve bu ismin WP_Widget ile bağlantılı olduğunu söylüyoruz. Functions dosyasında widgeti çağırmayı en altta göreceksiniz.
class SonYorumlar extends WP_Widget {
Devamında yapıyı tanıtıyoruz ve id ile bileşenler sayfasında gözükecek olan ismi belirtiyoruz.
function __construct() {
parent::__construct(
'son-yorumlar', // Base ID
'Evil: Son Yorumlar' // Name
);
add_action( 'widgets_init', function() {
register_widget( 'SonYorumlar' );
});
}
Burada bir aşağıda fonksiyon içerisinde kullanacağımız argümanları hazırlıyoruz.
public $args = array(
'before_title' => '<h4 class="widgettitle">',
'after_title' => '</h4>',
'before_widget' => '<div class="widget-wrap">',
'after_widget' => '</div></div>'
);
Şimdi geldik gönderileri çekeceğimiz kısıma. Ben bu kısmı alışkanlıktan ötürü ortada tutmayı tercih ediyorum siz istediğiniz fonksiyon ile yer değiştirebilirsiniz. Echo args yazan kısımda yukarıda hazırladığımız argüman arrayinden isim kullanarak kodları çekiyoruz. Bu yapı bize farklı temalarda aynı widgeti kullanacağımız zaman daha kolay editleme imkanı sunuyor. Hemen altında yer alan kısımda bileşene başlık yazılıp yazılmadığını kontrol ediyoruz. Bir altındaki yapıda ise en son kısımda göreceğiniz ve aşağıda resimde de yer alan maksimum kaç tane yorum gösterilmesini istiyorsak o sayıyı girmemizin gerektiği input kısmının dolu veya boş olup olmadığını kontrol ediyoruz. Eğer boş ise else kısmında yer alan kodlar çalışacağı için 'number'=>5 yani 5 adet yorumu çekecektir. Eğer herhangi bir sayı girdiysek örneğin "3" girersek o kadar yorum çekecektir eğer varsa. Yapıya gelecek de olursak get_comments komutu WordPressdenadından da anlaşılacağı üzere yorumları çekmeye yarar. number kısmı kaç yorum çekileceğini, status kısmı yorum durumunu (kodlarda approve yazıyor yani onaylanan yorumları çekiyor) post_status ise hangi gönderilerdeki yorumları çekeceğini anlatır (publish yani yayınlanmış gönderilerdeki yorumları çekiyor) yani eğer 3 yazısını girersek. Tek bir satır kod ile WordPress sitemizdeki yayınlanmış gönderilerdeki, onaylanmış yorumlardan en son 3 tanesini çekecektir. Ve count($str) ile yorumda kaç kelime olduğunu sayıp eğer 11 kelimeden fazla ise '...' ekliyoruz yorumun sonuna.


public function widget( $args, $instance ) {

echo $args['before_widget'];

if ( ! empty( $instance['title'] ) ) {
echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
}

if($instance["kactanegosterilsin"] != null){
$comments = get_comments(array('number'=>$instance["kactanegosterilsin"],'status'=>'approve','post_status'=>'publish'));
}else{
$comments = get_comments(array('number'=>5,'status'=>'approve','post_status'=>'publish'));
}
?>

<ul class="son-yorumlar">
<?php foreach ($comments as $comment): ?>
<li>
<div class="tab-item-inner clean">
<?php
$str=explode(' ',get_comment_excerpt($comment->comment_ID));
$comment_excerpt=implode(' ',array_slice($str,0,11));
if(count($str) > 11){
$comment_excerpt.='...';
}
?>
<span class="yorumu-yapan"><?php echo esc_attr( $comment->comment_author ); ?></span>

<span class="yorumu"><a href="<?php echo esc_url(get_comment_link($comment->comment_ID)); ?>"><?php echo esc_attr( $comment_excerpt ); ?></a></span>
</div>
</li>
<?php endforeach; ?>
</ul>
<?php

echo $args['after_widget'];
} ?>
Sıra geldi son kısıma geri kalan fonskiyonlar basit ve anlaşılabilir olduğu için (yukarıdakiler de öyleydi ama bunlar daha basitler )tek bir yerde toplamaya karar verdim. Burada yukarıdaki resimdeki form yapısını oluşturuyoruz. Girdileri bu kısımdan yapıyoruz ve kayıt ediyoruz.

 public function form( $instance ) {
$title = ! empty( $instance['title'] ) ? $instance['title'] : esc_html__( '', 'text_domain' );
$kactanegosterilsin = ! empty( $instance['kactanegosterilsin'] ) ? $instance['kactanegosterilsin'] : esc_html__( '', 'text_domain' );
?>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php echo esc_html__( 'Başlık:', 'text_domain' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
</p>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'Text' ) ); ?>"><?php echo esc_html__( 'Kaç Tane Gösterilsin: (standart 5)', 'text_domain' ); ?></label>
<input type="number" min="1" max="5" class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'kactanegosterilsin' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'kactanegosterilsin' ) ); ?>" cols="30" rows="10"><?php echo esc_attr( $kactanegosterilsin ); ?>
</p>
<?php
}

public function update( $new_instance, $old_instance ) {
$instance = array();
$instance['title'] = ( !empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
$instance['kactanegosterilsin'] = ( !empty( $new_instance['kactanegosterilsin'] ) ) ? $new_instance['kactanegosterilsin'] : '';
return $instance;
}
}
$sonyorumlar = new SonYorumlar();
Neredeyse unutuyordum En son olarak aşağıdaki kod ile functions.php veya tema yapımıza uygun dilediğimiz başka bir yerden widgeti çağırıyoruz.
load_template( get_template_directory( ) . '/functions/widgets/son-yorumlar.php' );


Edit: Eğer kodları tüm şekilde görmek veya direkt indirmek isteyenler olursa diye Githuba yükledim şöyle bırakıyorum: https://github.com/EvilBozkurt/son-yorumlar