WordPress PHP Kod Standartları

Ana Sayfa Blog Wordpress Kod WordPress PHP Kod Standartları

WordPress kodlarının bir bakışta kolay ve temiz bir şekilde okunabilmesi için wordpress.org tarafından bazı PHP kod standartları belirlenmiştir. Bu standartlara uyarak WordPress developer dünyasında yerimizi daha da sağlamlaştırıyoruz.

Bazı topluluk siteleri (ör: wordpress.org, themeforest.net) bu kod standartlarını oldukça önemsemektedir. Eğer bir projeniz varsa ve bu projeyi belirtilen sitelerde yayımlamak istiyorsanız, sizden bu standartlara uymanız istenebilir.

1. Tırnak İşareti Kullanımı

Kod satırınıza eğer değişken kullanmıyorsanız daima tek tırnak kullanın.

// Burada herangi bir değişken olmadığı için tek tırnak kullandık.
echo '<a href="#test">Test</a>';

// Değişken kullanmak istiyorsanız çift tırnak kullanın.
echo "<a href='$link'>Test</a>";

Fakat değişkenleri doğrudan kod satırlarında kullanmamanız gerekiyor. Üstteki örnekte $link değişkenini doğrudan yazdırdık. Fakat doğru kullanım aşağıdaki gibi olmalıydı.

echo '<a href="' . esc_attr( $link ) . '">Test</a>';

Değişkenleri doğrudan bastırmamamızın sebebi güvenlik açıklarını önlemek. Bunun için kodlarımızı bastırmadan önce escape yaptırmamız gerekiyor. Detaylı bilgi için wordpress data validation sayfasını inceleyebilirsiniz.

2. Girinti ve Boşluklar

for, foreach, while, if else, array() gibi kod bloklarında daima tab tuşunu kullanarak girinti oluşturun. Boşluk tuşunu kullanmayın. Boşluk tuşunu sadece okunurluğu artırmak için gereken yerlerde kullanın.

// foreach için örnek
foreach( $items as $item ) {
    echo $item[ 'title' ];
    echo $item[ 'url' ];
    echo $item[ 'description' ];
}

// if else için örnek
if( have_posts() ) {
    echo 'Yazı Bulundu!';
} else {
    echo 'Yazı Bulunamadı!';
    echo 'Tüh :(';
}

// array için örnek
$args = array(
    'echo'    => false,
    'include' => array( 1, 2 )
);

Dizi içerisindeki ögeler birden fazla ise her bir öge için yeni bir satır kullanılmalıdır.

// Tek ögeli dizi için tek satır kullanılmalı.
$query = new WP_Query( array( 'ID' => 123 ) );

// Birden fazla ögeli dizilerde $args gibi değişkene atanarak
// her bir öge için ayrı satır oluşturulmalı.
$args = array(
    'post_type'   => 'page',
    'post_author' => 123,
    'post_status' => 'publish',
);

$query = new WP_Query( $args );

Dizi içerisindeki son ögeye de virgül eklemeyi unutmayın. Bu dizinin sırasını değiştirmeyi kolaylaştırır ve daha temiz bir görünüm sunar.

// Doğru kullanım
$args = array(
    'post_type'   => 'page',
    'post_author' => 123,
    'post_status' => 'publish',
);

// Yanlış kullanım
$args = array(
    'post_type'   => 'page',
    'post_author' => 123,
    'post_status' => 'publish'
);

Switch case bloklarında switch ten sonra 1 tab, case den sonra da 1 tab kullanılmalıdır.

switch( $type ) {
    case 'foo':
        some_function();
        break;
    case 'bar':
        some_function();
        break;
}

3. Parantezler

Parantezler aşağıda gösterilen tarzda olacak şekilde bütün kod bloklarında kullanılmalıdır.

Zorunlu olmasa bile parantez kullanmanız gerekir.

// Doğru kullanım
if( condition ) {
    action1();
    action2();
} elseif( condition2 && condition3 ) {
    action3();
    action4();
} else {
    defaultaction();
}

// Yanlış kullanım
if( condition ) action1();

if( condition )
    action1();

if( condition ):
    action1();
endif;

Eğer php kodlarınızın içerisine html kodları da dahil ediyorsanız parantez yerine if/endif kullanabilirsiniz.

<?php if ( have_posts() ) : ?>
    <div class="hfeed">
        <?php while ( have_posts() ) : the_post(); ?>
            <article id="post-<?php the_ID() ?>" class="<?php post_class() ?>">
                <!-- ... -->
            </article>
        <?php endwhile; ?>
    </div>
<?php endif; ?>

“else if” yerine daima “elseif” kullanın!

4. Array Kullanımı

Kısa array yerine uzun array kullanın. Çünkü uzun array daha okunaklıdır.

// Doğru kullanım
$args = array(
    'echo'    => false,
    'include' => array( 1, 2 ),
);

// Yanlış kullanım
$args = [
    'echo'    => false,
    'include' => [ 1, 2 ],
];

5. Fonksiyon İçerisindeki Çağrılar

Bir fonksiyon içerisine dışarıdan çağrı yapıyorsanız bunu değişkenlere atayarak yapmalısınız. Doğrudan fonksiyon içerisinde kullanmamalısınız.

// Doğru kullanım
$foo = array(
	'echo'    => false,
	'include' => 1,
);
$bar = esc_html__( 'Test Yazı', 'text-domain' );
test_fonksiyon( $foo, $bar );

// Yanlış kullanım
test_fonksiyon( array( echo => false, include => 1 ), esc_html__( 'Test Yazı', 'text-domain' ) );

6. PHP Taglarının Açılıp Kapatılması

PHP kodları içerisinde html kullanıldığında php açıp kapama taglarının (<?php ve ?>) kendilerine ait özel bir satırı olmalıdır.

Tek satırlık kodlarda bu işlem yapılmamalıdır. PHP açma kapama tagları da tek satır içerisinde verilmelidir.

// Açma kapama taglarına özel satır verdik.
function foo() {
    ?>
        <div>
        <?php
        echo bar(
            $baz,
            $bat
        );
        ?>
        </div>
    <?php
}
// Tek satırlık örnek
<input name="<?php echo esc_attr( $name ); ?>" />
	
// Yanlış Kullanım
if ( $a === $b ) { ?>
<some html>
<?php }

7. PHP Taglarının Kullanımı

ÖNEMLİ: Asla kısa php taglarını kullanmayın. Daima uzun olanını kullanın.

// Doğru kullanım
<?php ... ?>
<?php echo $var; ?>

// Yanlış kullanım
<? ... ?>
<?= $var ?>

8. Satır Sonu Boşlukları

PHP dosyalarında satır sonundaki ?> kapanış etiketini kullanmamanız tavsiye edilir. Ancak eğer kullandıysanız bu satırdan sonra herhangi bir boşluk bırakmadığınıza emin olun.

9. Boşluk Kullanımı

Virgüllerden sonra ve karşılaştırma operatörlerinin her iki tarafında daima boşluk kullanın.

x === 23
foo && bar
! foo
array( 1, 2, 3 )
$baz . '-5'
$term .= 'X'

for, foreach, while, switch ve fonksiyon gibi bloklarda parantez içlerinde boşluk bırakın.

foreach ( $foo as $bar ) { ...

function my_function( $param1 = 'foo', $param2 = 'bar' ) { ...

function my_other_function() { ...

my_function( $param1, func_param( $param2 ) );
my_other_function();

Mantıksal karşılaştırmalardaki parantezlerde de boşluk kullanın.

if ( ! $foo ) { ...

Type casts kullanırken boşlukla beraber daima küçük harf ve kısa olanı kullanmalısınız.

// Doğru kullanım
(int)
(array)
(bool)

foreach ( (array) $foo as $bar ) { ...
$foo = (bool) $bar;

// Yanlış kullanım
(boolean)
(INTEGER)
(INT)
(integer)
(ARRAY)

Array içerisindeki ögelerde sadece değişken kullanılmışsa boşluk bırakmalısınız.

$x = $foo['bar']; // doğru
$x = $foo[ 'bar' ]; // yanlış

$x = $foo[0]; // doğru
$x = $foo[ 0 ]; // yanlış

// Sadece değişken olunca boşluk bıraktık.
$x = $foo[ $bar ]; // doğru
$x = $foo[$bar]; // yanlış

Switch bloklarında case yazısından sonra boşluk bırakılmamalıdır.

switch ( $foo ) {
	case 'bar': // doğru
	case 'ba' : // yanlış
}

Kısaca aksi belirtilmedikçe parantez içlerinde daima boşluk kullanılmalıdır.

if ( $foo && ( $bar || $baz ) ) { ...
 
my_function( ( $x - 1 ) * 5, $y );

10. SQL Kullanımı

SQL komutlarını kullanırken UPDATE, WHERE gibi sql ifadeler büyük harflerle yazılmalı.

Veritabanı işlemi yapan fonksiyonlar, doğrulamaları ve escape işlemlerini yapmayabilir. Bunu en iyi şekilde yapabilmek için $wpdb->prepare() fonksiyonunu kullanın.

$wpdb->prepare() fonksiyonu sql sorguları için otomatik doğrulama ve escape işlemi yapar. Kullanımı sprintf ile benzerdir.

$var = "dangerous'"; // escape yapılmamış veri
$id = some_foo_number(); // int olması beklenen veri
 
$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_title = %s WHERE ID = %d", $var, $id ) );

Yukarıdaki örnekte gördüğümüz üzere bir adet escape yapılmamış veri bir adette int olmasını istediğimiz ama emin olamadığımız veri var. İkisi de güvenlik zafiyeti oluşturmakta. Bu yüzden $wpdb->prepare() kullanarak iki sorundan da kurtulmuş oluyoruz.

UYARI: String ögeleri için %s integer ögeler için %d kullanmalısınız. Aksi halde fonksiyon düzgün çalışmaz. Ayrıca bu iki değeri tırnak içerisine almamalısınız. Bu fonksiyonu kullandığınızda esc_sql() kullanmanıza gerek kalmıyor.

NOT: Veritabanına doğrudan erişmekten kaçının. Bunun yerine WordPress’in var olan fonksiyonlarını kullanın. update_option(), update_post_meta(), update_user_meta() gibi. Eğer işinizi görecek bu tarz fonksiyonlar yoksa o zaman veritabanı sorgularını kullanabilirsiniz.

11. Adlandırma Kuralları

Değişkenlerde, action/filter adlarında ve fonksiyon isimlerinde daima küçük karakterler kullanın. camelCase tarzı isimlendirme asla kullanmayın. Kelimeleri alt çizgi ile ayırın. Değişken isimlerini gereksiz yere kısaltmayın. İsimler açık ve anlaşılır olsun.

// Doğru kullanım
function test_fonksiyon_ismi( $test_degisken_ismi ) { ... }

// Yanlış kullanım
function testFonksiyonIsmi( $testDegiskenIsmi ) { ... }

Class isimlerinin ilk harfi Büyük olmalı ve kelimeler al çizgi ile ayrılmalıdır. Eğer kısaltma isim kullanılıyorsa tamamı BÜYÜK HARF olmalıdır.

class Walker_Category extends Walker { [...] }
class WP_HTTP { [...] }

Sabit değişkenler (constants – define) tamamen büyük harfle yazılmalı ve kelimeler alt çizgi ile ayrılmalı.

define( 'DOING_AJAX', true );
define( 'TEST_DENEME_DEGISKENI', 'test' );

Dosya isimleri küçük harfle yazılmalı ve kelimeler tire ile ayrılmalı. Örneğin: deneme-dosya.php

Class dosyaları class- ön eki ile başlamalı ve devamı içerisindeki class adı ile getirilmeli. Örneğin içerisindeki class adı WP_Error ise dosya adı class-wp-error.php olmalı.

12. Fonksiyon Argümanları

Fonksiyon argümanlarında boolean yani true, false kullanmayın. Çünkü bu kullanım fonksiyonun anlaşılmasını zorlaştırır.

// Yanlış kullanım
function eat( $what, $slowly = true ) {
    ...
}

// Doğru kullanım
function eat( $what, $speed = 'slowly' ) {
    ...
}

13. Karşılaştırmalar

Karşılaştırma yaparken değişkenleri daima sağ tarafta tutun. Ayrıca daima üçlü işaretleri kullanmaya özen gösterin. ===, !== gibi.

// Doğru kullanım
if( true === $variable ) {
	...
}

// Yanlış kullanım
if( $variable == true ) {
	...
}

14. Temiz Kodlama

Genel olarak okunabilirlik, akıllı veya kısa kodlamadan daha iyidir.

// Bu kod gayet akıllıca ve kısa. Fakat düzgün anlaşılmıyor.
isset( $var ) || $var = some_function();

// Bu daha iyi ve anlaşılır.
if ( ! isset( $var ) ) {
	$var = some_function();
}

// Yanlış kullanım
if ( $data = $wpdb->get_var( '...' ) ) {
    // Use $data
}

// Doğru kullanım
$data = $wpdb->get_var( '...' );
if ( $data ) {
    // Use $data
}

15. extract() Kullanmayın

extract() fonksiyonunda hata ayıklama işlemi çok zordur ve anlaşılması da pek kolay değildir. Bu yüzden kullanmaktan kaçının.

Bir cevap yazın