MySQL’de JSON Verileriyle Çalışmak

Bu yazımda sizlere mysql’de json olarak depoladığımız veriler üzerinde listelemearamadüzenleme gibi işlemler nasıl yapılır bunlardan bahsetmek istiyorum. Eğer JSON ile uğraşıyorken aklınıza NoSQL veritabanları geliyorsa haklısınız, ancak mysql’de de bir takım işlemler yapabildiğimizi unutmamak lazım 🙂

Öncelikle neden JSON olarak veri depolarız? Ben kendi adıma konuşacak olursam, örneğin seo bilgilerini json formatında tutuyorum. Yani title, description, keywords ama yarın öbürgün ekstra bir bilgi daha ekleyebilirim örneğin noindex, canonical vb. Bunun için sürekli gidip kolon oluşturmak tamamen saçmalık olurdu. Bu yüzden tüm bu değerleri tek bir kolon altında json formatında tutuyorum. Ve yeri geldiğinde bunları filtrelemek, bunlar içinde arama yapmak gerekirse değiştirmek, listelerken ayrı ayrı göstermek isteyebilirim.

İşte bu noktada mysql’de bazı fonksiyonlar bize yardım edecek. Alışılmışın dışında bir sorgu yazıyormuşuz gibi görünsede, aslında ne kadar kolay olduklarını birazdan anlayacaksınız 🙂

JSON Veri Eklemek

Biz aslında PHP tarafında json_encode() fonksiyonu ile dizileri ya da objeleri json haline getirerek ekleyebiliyoruz. Örnek vermek gerekirse;

<?php

$arr = [
    'title' => 'Erbilen.net',
    'description' => 'Tayfun Erbilen\'in Bloğu'
];

echo json_encode($arr);
// Çıktı: {"title": "Erbilen.net", "description": "Tayfun Erbilen'in Bloğu"}

PHP’de json ile ilgili işlemlerin daha fazlası için şu yazıma gözatabilirsiniz. MySQL tarafında elle json veri eklemek istersek;

INSERT INTO tablo_adi
SET kolon_adi = '{"title": "Erbilen.net", "description": "Tayfun Erbilen\'in Bloğu"}'

Gördüğünüz gibi çok ekstra bir şeyi yok. JSON ekleme aynı zamanda şu fonksiyonlar ile de olabilir;

JSON_ARRAY

Bu fonksiyon geriye array döndürecektir. Kullanımı ise;

INSERT INTO tablo_adi
SET kolon_adi = JSON_ARRAY('tayfun','erbilen');
#    ['tayfun','erbilen']

JSON_OBJECT

Bu fonksiyon geriye obje döndürecektir. Kullanımı ise;

INSERT INTO tablo_adi
SET kolon_adi = JSON_OBJECT('ad','erbilen','soyad','erbilen');
#    {"ad": "erbilen", "soyad": "erbilen"}<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">​</span>

JSON_MERGE

Bu fonksiyon array ve objeleri birleştirecektir. Kullanımı ise;

INSERT INTO tablo_adi
SET kolon_adi = JSON_MERGE('{"ad":"tayfun"}','{"soyad":"erbilen"}', '[1,2,3]');
#   [{"ad": "tayfun", "soyad": "erbilen"}, 1, 2, 3]

JSON_TYPE ve JSON_VALID

Bu iki fonksiyon json formatının doğruluğunu kontrol eder. JSON_TYPE’da geriye ARRAY, OBJECT ya da hata mesajı döner. JSON_VALID’de ise format doğru ise 1 değil ise 0 döner. Kullanımı ise;

-- dönen değer ARRAY:
SELECT JSON_TYPE('[5, 7, "erbilen.net"]');

-- dönen değer OBJECT:
SELECT JSON_TYPE('{"ad": "tayfun", "soyad": "erbilen"}');

-- dönen değer hata mesajı:
SELECT JSON_TYPE('{"ad": "tayfun", "soyad": "erbilen"');

-- dönen değer 1:
SELECT JSON_VALID('[5, 7, "erbilen.net"]');

-- dönen değer 1:
SELECT JSON_VALID('{"ad": "tayfun", "soyad": "erbilen"}');

-- dönen değer 0:
SELECT JSON_VALID('{"ad": "tayfun", "soyad": "erbilen"');

JSON içinde Arama

JSON verileri depoladıktan sonra önemli olan onlar içerisinde belli bir düzende arama yapıp onları listelemektir. Bunun için birkaç yararlı fonksiyonu inceleyeceğiz;

JSON_CONTAINS()

Bu fonksiyon ile JSON içerisinde istediğimiz şeyin olup olmadığını kontrol ediyoruz. Örneğin array’de bir değer ya da obje’de bir key value gibi. Hemen örneklendirelim;

# kolon_adi = {"ad":"tayfun","soyad":"erbilen"}
SELECT * FROM tablo_adi
WHERE JSON_CONTAINS(kolon_adi, '{"soyad": "erbilen"}');

Yukarıdaki örnekte kolon_adi kolonunda depolanan json değerler içerisinde soyad objesi olup değeri erbilen’e eşit olanlar listelenecektir.

SELECT * FROM tablo_adi
WHERE JSON_CONTAINS(kolon_adi, '[2]');

Yukarıdaki örnekte ise kolon_adi kolonunda depolanan array içerisinde 2 değeri olanlar listelenecektir.

JSON_SEARCH()

Bu fonksiyon ile JSON olarak depoladığımız değerlerin path’leri bulmanızı sağlıyor. İlk parametresi JSON değeri, ikinci parametresi ise all ya da one olarak belirlenmeli. all derseniz eğer aradığınız değer birden fazla ise hepsini döndürür one derseniz sadece ilkini döndürür. 3. parametre ise aradığınız değer olarak belirlenmeli. Örneğin;

SELECT JSON_SEARCH(kolon_adi, 'all', 'soyad') FROM tablo_adi
# Örnek çıktı:   ["$[0]", "$[1].deneme"]

JSON_EXTRACT()

Bu fonksiyon ile json pathlerini belirleyerek işlem yapabiliyoruz. Örneğin json veri içerisinde soyad’a sahip olanları listelemek istersek;

SELECT * FROM test_tablo
WHERE JSON_EXTRACT(test_kolon, '$.soyad')

Bu örnekte test_kolon içerisinde aşağıdaki gibi bir json saklandığını farz ediyoruz.

{"ad": "tyfn", "soyad": "erbilen"}

Kısaca aşağıdaki JSON verisini baz alırsak;

{
  "a": 1,
  "b": 2,
  "c": [3, 4],
  "d": {
    "e": 5,
    "f": 6
  }
}

O halde JSON_EXTRACT() içerisinde path’leri şu mantıkta kullanabiliriz;

$.a – 1 döndürür
$.c – [3,4] döndürür
$.c[0] – 3 döndürür
$.d.e – 5 döndürür
$**.e – 5 döndürür

Sorgularda JSON Yollarını Almak

JSON Path’leri herhangi bir fonksiyon yardımı olmadan da sorgularda kullanabiliriz. Bunun için tablo_adi->’$.path’ şeklinde bir kullanım söz konusu. Yukarıdaki kullanım şekillerini baz alabilirsiniz.

SELECT kolon_adi->'$.ad' as ad FROM tablo_adi;
# ya da
SELECT * FROM tabo_adi
WHERE kolon_adi->'$.ad' = 'tayfun';

JSON Verilerini Düzenleme

Bu işlem için birkaç fonksiyon var.

JSON_REPLACE()

İlk parametresi json verisi, 2. parametresi path yani yolu, 3. parametresi ise yeni değeri. Daha sonrasında path, value, path, value şeklinde devam ederek kullanılabilir.

UPDATE tablo_adi
SET kolon_adi = JSON_REPLACE(kolon_adi, '$.uye.ad', 'Tayfun')

JSON_SET()

JSON_REPLACE ile aynıdır. Kullanımlarıda aynı şekildedir.

JSON_INSERT()

JSON verisine yeni değerler eklemek için kullanılıyor. Örneğin;

UPDATE tablo_adi
SET kolon_adi = JSON_INSERT(kolon_adi, '$.adsoyad', 'Tayfun Erbilen')
WHERE id = 2

JSON_REMOVE()

JSON verisinden değer silmek için kullanılıyor. Örneğin;

UPDATE tablo_adi
SET kolon_adi = JSON_REMOVE(kolon_adi, '$.adsoyad')
WHERE id = 2

Bu makalemizde buraya kadardı 🙂

Eğer daha fazla merak ettiyseniz mysql’in kendi döküman sayfasından devamını inceleyebilirsiniz.

Bkz: https://dev.mysql.com/doc/refman/en/json-functions.html

PHP ile Excel Dosyalarını Okumak

Şu yazımda php ile nasıl excel dosyası oluşturulacağını göstermiştim. Bu yazımda ise, daha elzem bir konuya değineceğiz. Geçenlerde bir excel dosyasının içinden verileri almam gerekti, araştırırken baktım ki çok kalabalık kodlar var, benim amacım alt tarafı satır satır okuyup verileri almak o kadar. Sonra bir repo’ya denk geldim, Sergey Shuchkin abimiz bir sınıf yazmış bu işlemler için. Basit, kullanışlı, amaca hitap ediyor.

Öncelikle dosyaları şuradan temin edin;
https://github.com/shuchkin/simplexlsx (not: adama star atmayı unutmayın :D)

Kullanımı ise çok basit;

if ( $xlsx = SimpleXLSX::parse('test.xlsx') ) {
    print_r( $xlsx->rows() );
} else {
    echo SimpleXLSX::parse_error();
}

excel’deki satırları dizi halinde size verecek, seçip istediğinizi kullanabilirsiniz.

Kolay gelsin.

PHP’de Transaction Kullanımı

En çok bankacılık sistemlerinde kullanılan bir olay bu. Örneğin bir hesaptan diğerine para aktarımında aslında 2 sorgumuz var. Önce mevcut hesaptan bakiye düşüyoruz, daha sonra diğer hesabın bakiyesine ekliyoruz. Ancak ya mevcut hesaptan bakiyeyi düştükten sonra diğer hesaba bakiye eklerken anlık bir sorun olursa ne olur? O zaman mevcut hesaptan para çıkar ama diğer hesaba para gelmez, işler karışır.

İşte bunu önlemek için sorguları transaction ile yaparsak, yani bir işlem bloğu içerisinde yaparsak sorun kalmayacaktır.

Transaction’ı PDO’da başlatmak için beginTransaction() metodu kullanılır;

$db->beginTransaction();

Daha sonra 2 sorguyu çalıştırırız;

$sorgu1 = $db->prepare('UPDATE accounts SET balance = balance - :amount WHERE account_id = :id');
$sonuc1 = $sorgu1->execute([
   'amount' => 250,
   'id' => 1
]);

$sorgu2 = $db->prepare('UPDATE accounts SET balance = balance + :amount WHERE account_id = :id');
$sonuc2 = $sorgu1->execute([
   'amount' => 250,
   'id' => 2
]);

Şimdi transaction içerisinde bu işlemleri yaptığımızda, eğer her 2 sorguda başarı ile sonuçlandıysa, o zaman commit() metodunu kullanarak işlemi tamamlayacağız. Eğer bir sorun olur ise rollBack() metodu ile yaptığımız işlemleri geri alabileceğiz.

if ($sonuc1 && $sonuc2){
   $db->commit(); // işlemi tamamla
} else {
   $db->rollBack(); // işlemi geri al
}

Siz transaction içindeki sorgularınız commit etmediğiniz sürece, sadece mevcut bağlantınızda veritabanı değişikliğini görürsünüz. Örneğin commite etmeden önce veritabanınızı kontrol ettiğinizde, sorguları çalıştırmış olmanıza rağmen değişikliği göremeyeceksiniz. Ne zaman ki commit metodunu çalıştırıp işlemi tamamlarsınız, o zaman bütün bağlantılarda bu işlem geçerli olacaktır.

Böylece olası durumlarda, kayıpları önlemek için harika bir yolu keşfetmiş oluyoruz.

Not: Eğer bu işlemi PDO’nun metodları ile değilde, mysql ile yapmak isterseniz. O zaman bir şeye dikkat çekmem gerek. Aynı işlemi PDO’nun transaction metodlarını kullanmadan yapalım.

$db->query('BEGIN TRANSACTION');

$sorgu1 = $db->prepare('UPDATE accounts SET balance = balance - :amount WHERE account_id = :id');
$sonuc1 = $sorgu1->execute([
   'amount' => 250,
   'id' => 1
]);

$sorgu2 = $db->prepare('UPDATE accounts SET balance = balance + :amount WHERE account_id = :id');
$sonuc2 = $sorgu1->execute([
   'amount' => 250,
   'id' => 2
]);

if ($sonuc1 && $sonuc2){
   $db->query('COMMIT'); // işlemi tamamla
} else {
   $db->query('ROLLBACK'); // işlemi geri al
}

Burada 2 işlemden birisi başarısız olsa bile otomatik commit ettiği için diğer tüm bağlantılarda da görünecek. Bunun önüne geçmek için, AUTOCOMMIT değerini 0 yapmamız gerekiyor. Yani kodların en başına bir de şunu eklediğimizde;

$db->query('SET AUTOCOMMIT = 0');

Artık işlem sorunsuz şekilde çalışacaktır. Ancak bunun yerine PDO’nun metodlarını kullanmak tabi ki daha yararlı 🙂

Başka bir anlatımda görüşmek üzere, detaylı anlatım için videoma gözatabilirsiniz.

WordPress Özel Bileşen Oluşturma

Merhaba arkadaşlar, bu dersimde sizlere nasıl özel bileşen (widget) oluşturulur bunu göstermek istiyorum.

Öncelikle WP_Widgets sınıfını genişleterek widget için bir class oluşturacağız.

class facebookLikeBox extends WP_Widget {

    public function __construct()
    {
    
    }
    
    // Yönetim panelindeki görülecek alanı burada hazırlayacağız
    public function form($instance)
    {
    
    }
    
    // Girilen değerleri burada kaydedeceğiz
    public function update($new_instance, $old_instance)
    {
    
    }
    
    // Tema alanında gözükecekleri buraya ekleyeceğiz
    public function widget($args, $instance)
    {
    
    }

}

__construct() Metodu
Bu metod, sınıf oluşturulduğunda çağırılacak ilk metoddur. Bu yüzden biz bu alanda üst sınıfın constuct metoduna bazı bilgiler göndereceğiz.

public function __construct()
{
    parent::__construct('widget_fblikebox', 'Facebook Likebox', [
        'classname' => 'Facebook Likebox',
        'description' => 'Facebook likebox oluşturmanızı sağlar'
    ]);
}

İlk parametrem ID, 2. parametrem başlık, 3. parametrem dizi olarak bir takım değerler göndermekti.form() Metodu
Bu kısımda yöneti panelinde bileşeni sürükleyip bırakınca gelecek olan form alanını hazırlayacağız.

public function form($instance)
{
    $fb_url = !empty($instance['fb_url']) ? $instance['fb_url'] : '';
    $fblikebox_title = !empty($instance['fblikebox_title']) ? $instance['fblikebox_title'] : '';
    ?>
    <p>
        <label for="<?php echo $this->get_field_id('fblikebox_title') ?>">Başlık:</label>
        <input type="text" id="<?php echo $this->get_field_id('fblikebox_title') ?>" name="<?php echo $this->get_field_name('fblikebox_title') ?>" value="<?php echo $fblikebox_title ?>">
    </p>
    <p>
        <label for="<?php echo $this->get_field_id('fb_url') ?>">Facebook Sayfa URL:
        <input type="text" id="<?php echo $this->get_field_id('fb_url') ?>" name="<?php echo $this->get_field_name('fb_url') ?>" value="<?php echo $fb_url ?>">
    </p>
    <?php
}

Burada get_field_id() ve get_field_name() metodları extend ettiğimiz sınıftan gelmektedir.update() Metodu
Bu kısımda form’dan gelen verileri kaydedeceğiz.

public function update($new_instance, $old_instance)
{
    $old_instance['fb_url'] = $new_instance['fb_url'];
    $old_instance['fblikebox_title'] = $new_instance['fblikebox_title'];
    return $old_instance;
}

widget() Metodu
Bu kısımda ise temada gözükmesini istediğimiz şeyleri ekleyeceğiz.

public function widget($args, $instance)
{
    $fb_url = $instance['fb_url'];
    $title = apply_filters('widget_title', $instance['fblikebox_title']);

    echo $args['before_widget']. $args['before_title']. $title .  $args['after_title'];
    ?>
    <div id="fb-root"></div>
    <script>(function(d, s, id) {
            var js, fjs = d.getElementsByTagName(s)[0];
            if (d.getElementById(id)) return;
            js = d.createElement(s); js.id = id;
            js.src = "//connect.facebook.net/en_GB/sdk.js#xfbml=1&version=v2.10";
            fjs.parentNode.insertBefore(js, fjs);
        }(document, 'script', 'facebook-jssdk'));</script>
    <div class="fb-page" data-href="<?php echo $fb_url; ?>" data-width="200" data-small-header="false" data-adapt-container-width="true" data-hide-cover="false" data-show-facepile="true"></div>
    <?php
    echo $args['after_widget'];
}

Daha fazla bilgi için videoya gözatmayı unutmayın!

WordPress Dinamik Bileşen Kullanımı

Bu dersimizde dinamik bileşenleri nasıl oluşturuyoruz, nasıl kullanıyoruz bunu göstereceğim.

İlk olarak kullandığınız tema içerisindeki functions.php dosyanızı açın.

Dinamik Bileşen Nasıl Eklenir?

Bir fonksiyon oluşturarak register_sidebar() fonksiyonu ile bileşeni oluşturacağız. widgets_init fonksiyonuna da kancamızı atacağız.

function register_widgets()
{
    register_sidebar([
        'name' => 'Arşiv Sidebar Alanı',
        'id' => 'archive_sidebar',
        'before_widget' => '<div class="widget %2$s">',
        'after_widget' => '</div>',
        'before_title' => '<h3 class="widget-title">',
        'after_title' => '</h3>'
    ]);
}

Dinamik Bileşen Tema İçinde Nasıl Kullanılır?

Göstermek istediğiniz sayfada aşağıdaki kodları yazmanız yeterli;

if (is_active_sidebar('archive_sidebar')){
    dynamic_sidebar('archive_sidebar');
}

WordPress Özel Profil Alanları Oluşturmak

Bu videomda sizlere profil için özel alanlar oluşturmayı ve bu alanları tema içerisinde kullanmayı gösterdim.

Not: Makale boyunca yazacağımız tüm fonksiyonları tema klasörümüz içerisinde functions.php dosyası içerisinde yazıyoruz.

Profil ve kullanıcı düzenleme sayfalarında özel alanların gösterilmesi

Bunun için bir fonksiyon yazmalı ve bu fonksiyonu önceden tanımlı 2 fonksiyona (show_user_profileedit_user_profile) kanca atmalıyız.

function show_extra_profile_fields($user)
{
    ?>
    <h2>Sosyal Hesaplar</h2>

    <table class="form-table">
        <tbody>
        <tr>
            <th>
                <label for="facebook">
                    Facebook Adresi
                </label>
            </th>
            <td>
                <input type="text" id="facebook" name="facebook" value="<?php echo esc_attr(get_the_author_meta('facebook', $user->ID)) ?>" class="regular-text">
            </td>
        </tr>
        <tr>
            <th>
                <label for="twitter">
                    Twitter Adresi
                </label>
            </th>
            <td>
                <input type="text" id="twitter" name="twitter" value="<?php echo esc_attr(get_the_author_meta('twitter', $user->ID)) ?>" class="regular-text">
                <p class="description">
                    Lütfen sadece twitter kullanıcı adınızı yazın!
                </p>
            </td>
        </tr>
        <tr>
            <th>
                <label for="instagram">
                    Instagram Adresi
                </label>
            </th>
            <td>
                <input type="text" id="instagram" name="instagram" value="<?php echo esc_attr(get_the_author_meta('instagram', $user->ID)) ?>" class="regular-text">
            </td>
        </tr>
        </tbody>
    </table>

    <?php
}

add_action('show_user_profile', 'show_extra_profile_fields');
add_action('edit_user_profile', 'show_extra_profile_fields');

esc_attr()
WordPress’in önceden tanımlı güvenlik için kullanılan fonksiyonudur.get_the_author_meta()
Özel alanların değerlerini almamız için kullanılan fonksiyondur. İlk parametre özel alanın ismi, ikinci parametre ise varsa üye id’sidir.

Özel alanların güncellenmesi

Bunun içinde bir fonksiyon yazmalı ve özel alanlarımızı güncellemeliyiz.

function update_extra_profile_fields($user_id)
{
    if (current_user_can('edit_user', $user_id)){
        update_user_meta($user_id, 'facebook', $_POST['facebook']);
        update_user_meta($user_id, 'twitter', $_POST['twitter']);
        update_user_meta($user_id, 'instagram', $_POST['instagram']);
    }
}

add_action('personal_options_update', 'update_extra_profile_fields');
add_action('edit_user_profile_update', 'update_extra_profile_fields');

current_user_can()
Mevcut kullanıcı için izin kontrolü yapan fonksiyondur. Burada edit_user yani bilgilerini düzenleme izninin olup olmadığını kontrol ettik.

Tema içerisinde kullanımı

Bunun için tema klasörümde author-bio.php dosyamı açıyorum. Ve uygun bir kısma, göstermek istediğim özel alanı şu şekilde yazıyorum;

<?php echo get_the_author_meta('facebook');

Burada facebook yerine siz kendi özel alan isminizi yazacaksınız. Benim örneğimde bu facebook, twitter ya da instagram olabilirdi 🙂

WordPress Özel Giriş Sayfası Hazırlamak

Bu dersimde, wordpress için özel giriş sayfası nasıl hazırlanır bundan bahsedeceğim. İşlemler çok kolay ve anlaşılır, anlamadığınız bir yer olursa sormayı unutmayın 🙂

Özel Sayfa Şablonu Oluşturma

wp-content > themes > tema_klasörü altında bir login.php dosyası oluşturun. Ve içerisine ilk olarak php’de şu açıklama satırlarını yazın;

<?php
/**
 * Template Name: Giriş Sayfası
 */

WordPress admin sayfasında sayfalar kısmından yeni sayfa oluştur deyin. Artık sağ kısımda sayfa şablonu diye bir alan çıktı. Oradan Giriş Sayfası olanı seçip Giriş ismiyle sayfanızı kaydedin.

Giriş Sayfasını Oluşturma

Tekrar tema klasörümüzdeki login.php‘ye dönüyoruz. Şimdi yapmamız gereken şey, temanın header ve footer‘larını yerleştirmek. Ardından giriş formunu wordpress’in wp_login_form() fonksiyonu ile oluşturmak.

<?php
/**
 * Template Name: Giriş Sayfası
 */

get_header();

wp_login_form([
    'redirect' => home_url()
]);

get_footer();

?>

Burada parametre olarak redirect değerine home_url() dedik. Yani anasayfaya gidecek giriş yaptığı zaman kullanıcı. Görüntü şöyle bir şey şuan bende;

İlgili Fonksiyonların Yazılması

Şimdi bazı kurallar ve işlemler için tema klasörünüzde bulunan functions.php dosyasına bazı fonksiyonlar yazacağız. Ve wp’nin fonksiyonlarına kancamızı atacağız.

Giriş Sayfasına Yönlendirme

Kullanıcı eğer doğrudan siteadi.com/wp-login.php sayfasına ulaşmaya çalışıyorsa kullanıcıyı kendi oluşturduğumuz giriş sayfasına yönlendirmemiz gerek.

function redirect_login_page()
{
    $login_page = home_url('giris');
    $param = basename($_SERVER['REQUEST_URI']);
    if ($param == 'wp-login.php' && $_SERVER['REQUEST_METHOD'] == 'GET') {
        wp_redirect($login_page);
        exit;
    }
}

add_action('init', 'redirect_login_page');

Şimdi burada önemli olan basename($_SERVER[‘REQUEST_URI’]) ile wp-login.php kısmını aldık. Ve karşılaştırıyoruz, eğer giriş sayfasında ise özel sayfamıza yönlendirme işlemini yapıyoruz ancak ek bir koşul belirttik. Sadece GET isteği olursa bunu yapıyoruz çünkü kullanıcı adı ve şifremizi yine aynı yere post edeceğiz o zaman çalışmaması gerek bu kodların.

Kullanıcı adı ya da şifre boş ise yönlendirme

Bunun için authenticate fonksiyonuna filtre ekleyeceğiz. Şu şekilde;

function verify_user($user, $username, $password)
{
    $login_page = home_url('giris?islem=bos');
    if ($username == '' || $password == '') {
        wp_redirect($login_page);
        exit;
    }
}

add_filter('authenticate', 'verify_user', 10, 3);

Bu seferde eğer değerler boş ise özel sayfamıza gönderiyoruz ancak ?islem=bos şeklinde. Bunu birazdan tema dosyamızda kontrol edip hataları göstermek için kullanacağız. Bu arada farklılık olarak add_filter() fonksiyonu 4 parametre aldı. 3. parametre öncelik sırası, default’y 10’dur yani işlem önceliğini belirtir önce hangisi çalışmalı gibisinden. 4. parametre ise fonksiyonun kaç parametre aldığıdır.

Kullanıcı adı ya da şifre hatalıysa yönlendirme

Bu işlem içinde wp_login_failed() fonksiyonuna kanca atıyoruz. Hemen görelim;

function login_failed()
{
    $login_page = home_url('giris?islem=basarisiz');
    wp_redirect($login_page);
    exit;
}

add_action('wp_login_failed', 'login_failed');

Burada da yönlendirme işleminde ?islem=basarisiz şeklinde kullandım.

Kullanıcı çıkış yaptığında yönlendirme

Diğerlerini yaptığımız için bunuda yapmak zorundayız. Kullanıcı çıkış yaptığında görüntülediği yere geri dönsün;

function logout_redirect()
{
    $redirect_url = $_SERVER['HTTP_REFERER'];
    wp_redirect($redirect_url);
    exit;
}

add_action('wp_logout', 'logout_redirect');

Kullanıcı giriş yapmışsa yönlendirme

Kullanıcı giriş yaptığında hala giriş sayfasına girmeye çalışıyorsa onu anasayfaya yönlendirmemiz gerek. Bunun içinde;

function redirect_home()
{
    if (is_user_logged_in() && is_page('giris')){
        wp_redirect(home_url());
        exit;
    }
}
add_action('template_redirect', 'redirect_home');

is_page() kısmında oluşturduğumuz sayfanın url’ni belirtmemiz gerek. Başka bir isim verdiyseniz, unutmayın 🙂

Hataların Gösterilmesi

Şimdi functions.php ile işimiz bitti. Tekrar tema klasörümüzde login.php dosyamızı açıp hatalar için bir switch-case yapısı kuruyoruz.

if (isset($_GET['islem'])){
    Switch ($_GET['islem']){
        case 'bos':
            $serror = 'Lütfen kullanıcı adı ya da şifrenizi yazın.';
            break;
        case 'basarisiz':
            $serror = 'Geçersiz kullanıcı adı ya da şifre girdiniz.';
            break;
    }
}

if (isset($serror)){
    echo $serror;
}

Bundan sonra güzel bir tasarım ile entegre ederek giriş ekranınızı kullanabilirsiniz, güle güle kullanın 🙂 Daha fazlası için videoya gözatmayı unutmayın.

PHP ile Ayın Kaç Gün Olduğunu Bulma

Bu konuda daha önce JavaScript için şöyle bir yazı yazmıştım. Aynı işlemi PHP’nin takvim fonksiyonları ile kolayca yapmamız mümkün.

İlk olarak, hangi fonksiyonu kullanacağız ve parametreleri neler?

cal_days_in_month(takvim, ay, yıl);

takvim – bunun için tanımlayacağımız belli başlı sabitler var. Örneğin Türkiye’nin şuan kullandığı gregoryen takvimi için CAL_GREGORIAN sabiti kullanılır.

Şimdi bir örnek ile taçlandıralım yazımızı;

$day = cal_days_in_month(CAL_GREGORIAN, 1, 1993);

echo '1993 Ocak ayının ' . $day . ' günü vardır';