WORDPRESS

WordPress Custom Post Type Oluşturma Nasıl Yapılır

WordPress Custom Post Type Oluşturma Nasıl Yapılır

Giriş

Bu rehberde, WordPress’e iki yeni post type ekleyecek olan bir eklenti oluşturacağız. Ardından taslakları kullanarak bu post type’ları için yeni tasarı oluşturacağız. Eğer eklenti oluşturma hakkında bilginizi tazelemek istiyorsanız, WordPress eklenti oluşturma rehberine göz atabilirsiniz.

Ayrıca her bir post type için yazı düzenleyicinin Custom Fields özelliğini etkinleştirerek, yeni taslaklardaki alanları göstereceğiz.

Özel Yazı Türleri, içeriğin ziyaretçilere gösterilme şekli üzerinde size tam kontrol verir. Eğer kişisel blog yazıları yazıyorsanız bunlar için bir tasarım oluşturabilirsiniz. Aynı zamanda film veya müzik incelemeleri yazıyorsanız, bunlar için blog yazılarınızda görünmeyen ekstra içerik bölgeleri ekleyebilirsiniz.

Ancak başlamadan önce, özel gönderi türleri nedir öğrenelim.

WordPress Custom Post Type Nedir?

Kısaca özetlemek gerekirse, WordPress özel yazı türleri içerik üzerinde yazıları düzenlemenizi sağlar. WordPress’de varsayılan yazı türleri Yazı, Sayfa, Ek Dosya vs gibi öğelerdir.

Genellikle tüm yazılarınızı Yönetici Kontrol Panelinde bulunan Yazılar bölümünden yazar ve ardından bir kategoriye eklersiniz. Bütün türlerdeki bütün yazılar aynı listede görünür ve içerdikleri bilgiye göre ayırması oldukça zor olabilir.

Özel yazı türleri yönetici kontrol panelinde kendilerine ait bağlantıya sahip olur ve tıklandığında o türdeki yazıların listesini gösterir. Bu yöntemle oluşturulan yazılar normal yazılar gibi kategorilere eklenebilir yani yazıları dilediğiniz gibi düzenleme ve sunma konusunda özgür olursunuz.Custom Post Türleri

Yukarıdaki örnekte eğer bir kullanıcı sitenizdeki film veritabanını açarsa inceleme yazıları dahil edilmez. Eğer örneğin ‘Aksiyon’ ve ‘Romans’ kategorileri oluşturursanız kullanıcılar Aksiyon filmleri için olan kategoriyi açabilir ve bu kategori için oluşturulan tüm incelemeleri görebilir.

Yeni bir yazı türü oluştururken bağlantının yönetici menüsünde nerede gösterileceği, arama sonuçlarında gönderi türünün dahil olup olmayacağı, özet gösterilip gösterilmeyeceği veya yorumlara izin verilip verilmeyeceği gibi pek çok seçeneğe sahipsiniz.

Yeni Yazı Ekle‘yi Yeni Film Ekle şeklinde yeniden adlandırma gibi yazıların çeşitli bölümlerini ($labels array kullanarak tanımlanır) değiştirebilirsiniz. Örneğin Öne Çıkan Görsel yazısını Poster Ekle olarak değiştirebilirsiniz.

Varsayılan olarak gizli bırakılan özel alanlar özelliğini yazı editöründe etkinleştirebilirsiniz. Bunu etkinleştirebilmek için editörün üst kısmında bulunan Ekran Seçenekleri‘ni kullanabilirsiniz.

Filmler ve Film İncelemeleri örneğiyle devam edersek, bir Film gönderisi film özetiyle birlikte çıkış tarihi, yönetmen, IMDB puanı gibi şeylere göre özel alanlar ekleyebilir.Özel Yazı Alanları Görünümü

Normal olarak oluşturacağınız özel alanlar tüm yazı türleri için seçilebilir olacaktır yani her bir alanın gösterileceği yeri bir eklentiyle sınırlamamız gerekiyor.

Özel Yazı Türü Oluşturma

WordPress’de önemli değişiklikler yaparken, bir eklenti oluşturmak kullanılabilir seçeneklerden birisidir. İsterseniz bir temanın functions.php dosyası içinde de özel gönderi türü oluşturabilirsiniz. Bu rehberde bir eklenti oluşturarak film veritabanı/incelemeleri örneğini ile devam edeceğiz.

Custom post type oluşturmak için iki parametreli register_post_type() adındaki WordPress fonksiyonunu çağıran yeni bir fonksiyon yazmalısınız. Fonksiyonunuz mutlaka init eylemine bağlanmalıdır, aksi takdirde özel gönderi türünüz düzgün şekilde kaydedilmez.

// The custom function MUST be hooked to the init action hook
add_action( 'init', 'lc_register_movie_post_type' );

// A custom function that calls register_post_type
function lc_register_movie_post_type() {

  // Set various pieces of text, $labels is used inside the $args array
  $labels = array(
     'name' => _x( 'Movies', 'post type general name' ),
     'singular_name' => _x( 'Movie', 'post type singular name' ),
     ...
  );

  // Set various pieces of information about the post type
  $args = array(
    'labels' => $labels,
    'description' => 'My custom post type',
    'public' => true,
    ...
  );

  // Register the movie post type with all the information contained in the $arguments array
  register_post_type( 'movie', $args );
}

register_post_type()‘ın iki parametresi şöyledir:Tüm özel fonksiyonlara, diğer eklenti veya tema fonksiyonlarıyla çakışmamaları için ön ek eklemelisiniz. Bu rehberde biz LC ek’ini kullanacağız.

  1. Post type adı, maksimum 20 karakter olabilir ve boşluk ile büyük harf
  2. ‘key => ‘value’ çifti içinde post type bilgisi içeren $args adında ilişkilendirilebilir bir array.

Argümanlar ve etiketler array olduğundan, öncelikle etiketleri kendi değişkeni içinde yazmak daha temiz olacaktır, ardından $args değişkeni ve sonrasında fonksiyonu çağırma.

Websitenizi barındırmanın daha iyi bir yolunumu arıyorsunuz?

Websitenizi 7/24 özel desteğe sahip en hızlı hosting platformuna taşıyın.

$args Array

$args array’i için en çok kullanılan anahtarlar aşağıdadır, hepsi opsiyoneldir:

  • labels – Metnin çeşitli parçalarını tanımlayan array’ Örneğin ‘Yeni Yazı’, ‘Yeni Film Ekle’ olarak değiştirilebilir. Etiketler array’i için anahtarlar aşağıdaki listede açıklanmıştır.
  • description – Yazı türünün kısa & açıklayıcı bir özeti. Bu yazı türü taslağında gösterilebilir ancak başka bir yerde kullanılmaz.
  • public – Yazı türünün yazar ve ziyaretçilere görünüp görünmeyeceğidir. Varsayılan değer FALSE’dır yani Yönetici Kontrol Panelinde bile gösterilmez.
  • excluse_from_search – Bu yazı türünün arama sonuçlarında gösterilip gösterilmeyeceğidir. Varsayılan değer public değerinin tam tersidir.
  • publicly_queryable – Bu yazı türündeki gönderilerin, http://www.websitem.com/?post_type=film gibi bir URL ile veya gelişmiş kullanımda query_posts() fonksiyonu ile açılıp açılmayacağıdır. Varsayılan değer public değeriyle aynıdır.
  • show_ui – Menü bağlantıları ve yazı editörünün Yönetici Kontrol Panelinde görünür olup olmadığıdır. Varsayılan değer public değeriyle aynıdır.
  • show_in_nav_menus – Bu türdeki yazıların Görünüm -> Menüler ekranında oluşturulan navigasyon menülerine eklenip eklenemeyeceğidir. Varsayılan değer public değeriyle aynıdır.
  • show_in_menu – Yazı türü bağlantısının Yönetici Kontrol Paneli navigasyonunda görünüp görünmeyeceğidir. FALSE bağlantıyı gizler. TRUE bağlantıyı yeni üst seviye bağlantı olarak ekler. Bir satır ekleyerek bağlantıyı, üst seviye bir bağlantıya alt-bağlantı olarak ekleyebilirsiniz. Örneğin options-general.php‘e girmek, Ayarlar bağlantısı altına yerleştirir.
  • show_in_admin_bar – Bu yazı türünün Yönetici çubuğundaki +Yeni bağlantısının altında görünüp görünmeyeceğidir.
  • menu_position – Yeni bağlantının Yönetici Kontrol Paneli navigasyon menüsündeki konumudur. 5 rakamı Yazıların altına, 100 rakamı Ayarlar’ın altına yerleştirir. Rakamların tam listesi için WordPress Codex girdisine göz atın.
  • hierarchical – yazıların başka bir yazı ailesine eklenip eklenemeyeceğidir. Eğer TRUE olursa $supports array’inde ‘page-attributes’ özelliği bulunmalıdır.
  • supports – öne çıkan görseller, özetler, özel alanlar vs gibi çeşitli yazı özelliklerini etkinleştirme. Eğer array yerine FALSE işaretlenirse, bu gönderi türü için editör devre dışı kalır. Eğer bu türdeki tüm yazıları görünebilir halde bırakarak kitlemek istiyorsanız faydalıdır (array değerleri listesi aşağıdadır)
  • taxonomies – sınıflandırma array’i bu türdeki yazılara uygulanabilir. sınıflandırmalar halihazırda kayıtlı olmalıdır – bu şekilde oluşturulamazlar!
  • has_archive – yazı türünün arşiv sayfası olup olmadığıdır. URL, kalıcı bağlantı yapısını takip eder. register_post_types()’ın parametre 1’inde eklemiş olduğunuz isim örneğin http://www.websitem.com/film_incelemeleri/ bağlantısı tüm film_incelemeleri yazılarını gösterir.
  • query_var – TRUE veya FALSE olması bir yazının, yazı türünü belirterek görünüp görünemeyeceğini belirler ve yazı adı URL’de gösterilir, mesela ‘http://www.websitem.com/?film=the-matrix‘. Eğer bir yazı satırı eklemek istiyorsanız, ? karakterinden sonra metin ekleyebilirsiniz. Yani ‘film’ ‘?film=the-matrix‘ sonucunu gösterir.

Tam listeyi görüntülemek üzere register_post_type() için WordPress Codex sayfasını ziyaret edebilirsiniz.

labels Array

$args array içerisindeki ilk anahtar labels ismindedir ve mutlaka bir array olmalıdır. Yazı türüyle alakalı metnin çeşitli parçalarını tanımlar. Bu oldukça fazla bilgi içerdiğinden, tutmak için $labels adında bir değişken oluşturmak mantıklıdır. Yukarıdaki örnek kod bunu biraz daha iyi açıklamaktadır.

labels array’i içindeki önemli anahtarlardan bazıları aşağıdadır, tamamı opsiyoneldir:

  • name – Yazı türü için genel çoğul bir isim, örneğin filmler
  • singular_name – Bu türdeki yazıların kendilerine verilen isim, örneğin film
  • add_new – ‘Yeni Ekle’ metnini değiştirir, örneğin ‘Film Ekle’
  • add_new_item – ‘Yazı Ekle’ metnini değiştirir, örneğin ‘Yeni Film Ekle’
  • edit_item – ‘Yazı Düzenle’ metnini değiştirir, örneğin ‘Film Düzenle’
  • featured_image – ‘Öne Çıkan Görsel’ metnini değiştirir, örneğin ‘Film Posteri’
  • set_featured_image – ‘Öne Çıkan Görsel Belirle’ metnini değiştirir, örneğin ‘Film Posteri Ekle’
  • menu_name – Üst seviye bağlantının metnini değiştirir. Bağlantının varsayılan metni name anahtarıdır

Tam listeyi görüntülemek üzere register_post_type() için WordPress Codex sayfasını ziyaret edebilirsiniz.

supports Array

// Enable specific features in the post editor for my post type
$supports = array ( 'title', 'editor', 'author', 'thumbnail' );

// Disable ALL features of the post editor for my post type
$supports = FALSE;

$args array içindeki anahtarlardan bir diğeri supports’dur. Bu, özel yazı türünüz için etkinleştirmek istediğiniz yazı editörü özelliklerinin listesini yazdığınız basit bir array’dir. Varsayılan olarak sadece başlık ve editör etkindir.

Array yerine FALSE yazabilirsiniz ve bu sayede başlık ve içerik alanı dahil tüm yazı düzenleme özelliklerini devre dışı bırakırsınız. Bunun anlamı yazılar düzenlenemez ancak hala tamamen görünebilir durumda kalırlar.

$supports array içinde etkinleştirebileceğiniz yazı editörü özelliklerinin listesi şöyledir:

  • başlık
  • editör
  • yazar – NOT: gönderinin yazarını değiştirmenizi sağlar
  • küçük resim
  • özet
  • geri izlemeler
  • özel-alanlar
  • yorumlar
  • revizyonlar
  • page-attributes
  • post-formats

Eklenti Aracılığıyla Yeni Yazı Türleri Oluşturma

Fonksiyon için hangi bilgilerin gerekli olduğunu öğrendiğimize göre eklentimizi oluşturabilir, özel fonksiyonlar yazarak bunları init eylem kancasına ekleyebiliriz.

<?php
/*
Plugin Name: My Custom Post Types
Description: Add post types for movies and movie reviews
Author: Liam Carberry
*/
 
// Hook <strong>lc_custom_post_movie()</strong> to the init action hook
add_action( 'init', 'lc_custom_post_movie' );
 
// The custom function to register a movie post type
function lc_custom_post_movie() {
 
  // Set the labels, this variable is used in the $args array
  $labels = array(
    'name'               => __( 'Movies' ),
    'singular_name'      => __( 'Movie' ),
    'add_new'            => __( 'Add New Movie' ),
    'add_new_item'       => __( 'Add New Movie' ),
    'edit_item'          => __( 'Edit Movie' ),
    'new_item'           => __( 'New Movie' ),
    'all_items'          => __( 'All Movies' ),
    'view_item'          => __( 'View Movie' ),
    'search_items'       => __( 'Search Movies' ),
    'featured_image'     => 'Poster',
    'set_featured_image' => 'Add Poster'
  );
 
  // The arguments for our post type, to be entered as parameter 2 of register_post_type()
  $args = array(
    'labels'            => $labels,
    'description'       => 'Holds our movies and movie specific data',
    'public'            => true,
    'menu_position'     => 5,
    'supports'          => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments', 'custom-fields' ),
    'has_archive'       => true,
    'show_in_admin_bar' => true,
    'show_in_nav_menus' => true,
    'has_archive'       => true,
    'query_var'         => 'film'
  );
 
  // Call the actual WordPress function
  // Parameter 1 is a name for the post type
  // Parameter 2 is the $args array
  register_post_type( 'movie', $args);
}
 
// Hook <strong>lc_custom_post_movie_reviews()</strong> to the init action hook
add_action( 'init', 'lc_custom_post_movie_reviews' );
 
// The custom function to register a movie review post type
function lc_custom_post_movie_reviews() {
 
  // Set the labels, this variable is used in the $args array
  $labels = array(
    'name'               => __( 'Movie Reviews' ),
    'singular_name'      => __( 'Movie Review' ),
    'add_new'            => __( 'Add New Movie Review' ),
    'add_new_item'       => __( 'Add New Movie Review' ),
    'edit_item'          => __( 'Edit Movie Review' ),
    'new_item'           => __( 'New Movie Review' ),
    'all_items'          => __( 'All Movie Reviews' ),
    'view_item'          => __( 'View Movie Reviews' ),
    'search_items'       => __( 'Search Movie Reviews' )
  );
 
  // The arguments for our post type, to be entered as parameter 2 of register_post_type()
  $args = array(
    'labels'            => $labels,
    'description'       => 'Holds our movie reviews',
    'public'            => true,
    'menu_position'     => 6,
    'supports'          => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments', 'custom-fields' ),
    'has_archive'       => true,
    'show_in_admin_bar' => true,
    'show_in_nav_menus' => true,
    'has_archive'       => true
  );
 
  // Call the actual WordPress function
  // Parameter 1 is a name for the post type
  // $args array goes in parameter 2.
  register_post_type( 'review', $args);
}

Fare imlecini buraya getirirseniz ‘View All’ ve ‘Yeni Ekle’  alt-bağlantılarını görürünüz. Metinler $labels array içerisinde ilgili tanımlardır. Editörde biraz bakının ve hangi etiketlerin değiştiğini görün.Eğer bu eklentiyi etkinleştirirseniz, Yönetici Kontrol Panel navigasyonunda iki yeni bağlantı göreceksiniz, hemen Yazılar bağlantısının altında.

Özel Gönderi Türü için Özel Alanları Sınırlama

Bir yazıya özel alanlar eklerken, alanlar kaydedilir ve böylelikle yeni yazılara hızlıca ekleme yapabilirsiniz. Eklemiş olduğunuz özel alanlar her yazıda açılır liste içinde gösterilir. Bu da özel yazı türleri için ihtiyacınız olan alanı bulmayı zorlaştırabilir. Eğer sadece belirli yazı türlerinde seçilebilecek şekilde bu alanları sınırlamak isterseniz, bunun en kolay yolu bir eklenti kullanmaktır.

Gelişmiş özel alanlar eklentisi, özel alanlar oluşturmanıza imkan sağlayan ve onları sadece gönderi türünüzde gösterebilen basit bir editördür.

Alanın ne tür bir girdi türü olacağını düzenleyebilirsiniz, örneğin metin kutusu, metin alanı, eposta adresleri gibi. Ya da daha gelişmiş bir seçenek olarak bir konum seçip, bu konumun yazılarınızda gösterilmesini sağlayan gömülü Google haritalar ekleyebilirsiniz.Gelişmiş Özel Alanlar WordPress Eklenti Görünümü

Aynı zamanda özel alanların düzenleme ekranının neresinde gösterileceğini ayarlayabilirsiniz.

Bu alanlar eklenti aracılığıyla oluşturulduğundan, gösterilmeleri için eklentinin fonksiyonlarını kullanmalısınız. Bu bir sonraki bölümde anlatılmıştır.

Yeni Yazı Türlerini Tasarlama

Yeni yazı türlerinize tema taslakları oluşturmak için, temanızın temel dizininde doğru isimli dosyalar oluşturmanız gerekiyor. Eğer taslaklar oluşturmazsanız, WordPress single.php ve archive.php kullanır ve tüm yazı ve arşivlerinizi benzer tutar.

  • Bireysel yazı için taslak – single-{post-type}.php
  • Arşiv sayfası için taslak – archive-{post-type}.php.

Dosya isimlerinin {post-type} bölümü, register_post_type()‘ın parametre 1’inden bir isim olmalıdır.

  • Film yazı türümüz için dosya isimleri single-movie.php ve archive-movie.php.
  • Film incelemeleri yazı türümüz için dosya isimleri single-review.php ve archive-review.php.
  • Başlamanın en iyi yolu php veya archive.php’leri kopyalamak ve yukarıdaki gibi yeniden adlandırmaktır. Bunun anlamı genel yapı temanızın kalanıyla birebir aynı olacaktır ve gerekli tüm taslak etiketleri olduğu yerde kalacaktır.

Yazılarda Özel Alanları Gösterme

Standart WordPress editöründe oluşturulan özel alanları göstermek için iki fonksiyon kullanabilirsiniz.

// Generates all custom fields attached to the post in a <ul> list
the_meta();

// Get a specific piece of information
echo get_post_meta( $post->ID, 'Budget', TRUE );

the_meta()Bu fonksiyonlar, yazınızın görüntülenmesi için kullanılan taslak dosyalarına eklenmelidir.

Yazıya eklenen tüm özel alanları <ul> listesi içinde gösterir. Nihai <ul> etiketleri şu şekilde görülür:

<ul class='post-meta'>
  <li>
    <span class='post-meta-key'>{your_key}</span> {your_value}
  </li>
</ul>

get_post_meta()Bu, tekli yazı taslağının herhangi bir yerine çalışır ancak eğer başka bir yerde görüntülüyorsanız, WordPress döngüsünde kalmış olabilir.

  • 3 parametreyi alır ve bir sonuç gösterir.
  • İlk parametre, yazının ID’sidir, $post->ID kullanarak görüntülenen yazının ID’sini alabilirsiniz.
  • İkinci parametre özel alanın adıdır ve büyük küçük harf duyarlıdır.
  • Üçüncü parametre $single adındaki boolean’dır ve TRUE (sonucu string olarak gösterir) veya FALSE (array gösterir) olarak düzenlenebilir.

NOT: Aynı isimde ve farklı değerlerde birden fazla özel alan oluşturabilirsiniz. Eğer aynı isimde birden fazla alan varsa, FALSE ayarı tamamını içeren bir array gösterir.

<?php
  $movie_box_art = get_post_meta( $post->ID, 'Box Art', TRUE );

if (!empty($movie_box_art)) { ?>
  <div class="movie-poster-box">
    <img src="<?php echo $movie_poster ?>" alt="<?php single_post_title(); ?> ">
  </div>
<? } ?>

get_post_meta() fonksiyonu bir değer gösterirken, bu değeri kondisyonel ifade (conditional statement) içinde kullanarak tasarımı uygun şekilde değiştirebilirsiniz.

Yukarıdaki örnekte, filmin özel alan aracılığıyla bir kapak resmi içerip içermediğini kontrol ediyoruz.

Gelişmiş Özel Alanları Gösterme

// Display field value
the_field( 'FIELD NAME' );

// Return field value
get_field( 'FIELD NAME' );

Gelişmiş Özel Alanlar eklentisi, alanları göstermek üzere kendi fonksiyon ve kısa kodlara sahiptir.ACF Alan Adı Ayarları

the_field(  ‘ FIELD NAME’  );

Seçili alanın değerini gösterir, alan grubunu oluştururken girmiş olduğunuz Alan Adını kullanmalısınız.

get_field( ‘FIELD NAME’ );

Seçili alanın değerini getirir, conditional statement’lar için kullanışlıdır.

İhtiyacınız olacak olan fonksiyonlar bunlardır. Bunların ötesinde çok daha fazla gelişmiş fonksiyon bulunuyor ve bunlara göz atmak için resmi rehbere göz atabilirsiniz.

Shortcode (kısa kod)

[acf field="FIELD NAME"]

Yukarıdaki kısa kodu kullanarak alanları doğrudan bir yazıda gösterebilirsiniz.

Özel Yazı Türlerini Ön sayfada gösterme

/ Hook our custom function to the pre_get_posts action hook
add_action( 'pre_get_posts', 'add_reviews_to_frontpage' );
 
// Alter the main query
function add_reviews_to_frontpage( $query ) {
    if ( is_home() && $query->is_main_query() ) {
        $query->set( 'post_type', array( 'post', 'movie', 'review' ) );
    }
    return $query;
}

Özel yazı türleri varsayılan olarak ön sayfada gösterilmez, dolayısıyla WordPress WP_Query objesinin set metodunu çağıran yeni bir fonksiyon yazmanız gerekiyor.

Bu fonksiyon ziyaretçinin anasayfada olup olmadığını ve aktif sorgu WordPress tarafından oluşturulup oluşturulmadığını kontrol eder.

$query->set() iki parametreden oluşur:

  • İlk parametre değiştirmek istediğiniz bölümdür, bizim örneğimizde post_type bölümünü değiştirmek istiyoruz.
  • İkinci parametre ise post_type bölümünün değeri olarak istediğiniz array’dir.
  • Yukarıdaki kodda, ‘post’ ile başlayan array – çünkü WordPress’de her bir yazının yazı türü ‘yazı’dır ve biz bunları anasayfada belirtmek istiyoruz.
  • Eğer önsayfada sadece belirli bir tür özel yazılar istiyorsanız ‘posts’ kısmını silerek kendi özel yazı türünüzü kullanın.
  • Array’e ‘film’ ve ‘inceleme’ ekledik, böylece ön sayfa artık tüm normal gönderileri, film yazılarını ve inceleme yazılarını gösteriyor.
  • Girmiş olduğunuz değer register_post_type() fonksiyonunun birinci parametresinde kullanılan isimle mutlaka aynı olmalıdır.

Sonuç

Bu rehberde özel yazı türleri nasıl oluşturulur ve hangi bilgileri içerir öğrenmiş oldunuz. Özel yazı türlerinin sağladığı esneklik herhangi WordPress sitesinin en önemli özelliklerinden birisidir.

Kategoriler ve sınıflandırmalar ile birleştirildiğinide kullanıcılarınızın yazılarınızı nasıl gördüğünü tam olarak kontrol edebilirsiniz.

Yorum Ekle

Yorum göndermek için buraya tıklayın

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Dünya çapında binlerce aboneye katılın

ve mükemmel fırsatlarla en yeni rehberler e-posta adresinize gelsin

Please wait...

Abone olduğunuz için teşekkürler!

Şimdi kazanmaya başlayın!

Hepsi bir arada web hosting & alan adı yalnızca

6
25 TL
/ay