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';

PHP goto İfadesi

PHP’de goto ifadesi, bir satırdan diğer satıra atlamak için kullanılıyor. Soyut olarak bir örnek vermek gerekirse;

goto erbilen;

echo 'burası okunmaz herhalde..';

erbilen:
echo 'buraya atladın!';

Bu kod parçacağı çalıştığında ekranda buraya atladın! yazısıyla karşılaşırız. Buda demek oluyor ki goto erbilen; komutundan sonra erbilen: kısmına atlayıp ondan sonrakileri çalıştırdı.

Örneğin bunu bir kontrol sisteminde yapmak istersek;

if (!isset($_SERVER['HTTP_REFERER'])){
    goto control;
}
if (!isset($_SESSION['login'])){
    goto control;
}

// .. kullanıcı giriş yapmışsa yapılacak işlemler vs.

control:
die('Bu sayfayı görüntüleme izniniz yok');

Nerede nasıl kullanılacağı belli olmaz, bir gün mutlaka işimize yarar. Bilmekte fayda var ????

Not: PHP 5.3 ve sonraki sürümünlerinde kullanabilirsiniz.

PHP ile A’dan Z’ye Kadar Yazdırmak

Bazen A’dan Z’ye kadar harfleri yazdırmak gerekiyor. Bu gibi durumlarda, php’de kullanacağımız 1-2 fonksiyon mevcut. Bir for döngüsü ile nasıl yapabileceğimize bakalım.

Öncelikle bu işlem için ord() ve chr() fonksiyonlarını kullanacağız. Peki ne işe yararlar?

ord() Fonksiyonu

İçine girilen karakterin ASCII değerini döndürür. Örn;

echo ord('a'); // Çıktı: 97

chr() Fonksiyonu

Buda tam tersine ASCII değerini karaktere dönüştürür. Örn;

echo chr(97); // Çıktı: a

Şimdi asıl örneğimize geçebiliriz. İngilizce de 26 harf olduğuna göre, for döngüsünde bunu şu şekilde belirteceğiz;

$ascii_val = ord('a');
for($i = $ascii_val; $i < $ascii_val + 26; $i++) {
    echo chr($i) . ' ';
}
// Çıktı: a b c d e f g h i j k l m n o p q r s t u v w x y z

Bu kod 97‘den başlayacak. $i değerini 97‘ye eşitledik. Ve koşul olarak $ideğeri (97 + 26 = 123) değerine gelene kadar $i‘yi 1 artırıyoruz. Yani sırasıyla, 97,98,99,100.. şeklinde giderek for içinde de ASCII değerlerine göre karakterleri döndürerek yazdırma işlemini yapıyoruz.

Diğer alternatif

range() fonksiyonu ile de bu işlemi yapabilirsiniz;

foreach(range('a', 'z') as $c){
    echo $c . ' ';
}

PHP ile HTTP Kimlik Doğrulaması

Bazı zamanlar belli bir adrese erişimde kimlik doğrulaması isteyebiliriz. Yani kullanıcı adı ve şifre yazarak sayfayı görüntülemesini. Ancak her zaman bir üyelik sistemimiz olmayabilir, bundan dolayı kimlik doğrulamanın alternatif bir yolunu sizlerle öğrenelim.

Şimdi ilk olarak geçerli olacak kullanıcı adı ve şifremizi belirleyelim.

$username = 'erbilen';
$password = '123123';

Hemen ardından kullanıcıdan alacağımız kullanıcı adı ve şifremizi değişkenlere aktaralım. Bu arada girilen değerleri almak için superglobal $_SERVER değişkenini kullanacağız.

$inputUsername = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : false;
$inputPassword = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : false;

Burada değişkenin varlık kontrolü için isset kullandık ve if/else yapısı yerine Ternary Operatörü ile işimizi hallettik.

Şimdi basit şekilde mevcut kullanıcı adı ve şifremi, girilen kullanıcı adı ve şifre ile eşleşip eşleşmediğini test edeceğim.

$validated = ($inputUsername == $username) && ($inputPassword == $password);

Sonuç olarak $validated değişkenimin değeri, kullanıcı eğer doğru kullanıcı adı ve şifreyi girmişse true değerini, yanlış ya da hiç girmemişse false değerini döndürecektir.

Buna göre de eğer false değeri dönmüş ise, kimlik doğrulaması için kodlarımızı çalıştıracağız.

if (!$validated) {
    header('WWW-Authenticate: Basic');
    header('HTTP/1.0 401 Unauthorized');
    die('Girmek için yetkiniz bulunmuyor!');
}

die() kısmı, kullanıcı adı ya da şifre girilmezse ya da yanlış girilirse kullanıcıya gözükecek alandır. Şimdi bu kodlarla birlikte sayfayı çalıştırdığımızda, şöyle bir görünüm elde edeceğiz ????

Kullanıcı adı ve şifremizi doğru yazdıktan sonra gözükmesi için if kısmının hemen altına birkaç bir şey yazalım.

Hoşgeldin, <b><?= $username ?> </b>

Artık kullanıcı adı ve şifremizi doğru yazdığımızda üstteki yazı gözükecek ve oturum sonlanana kadar giriş yapmış sayılacaksınız ????

Çıkış İşlemi

Bu işlem session gibi çalışmadığından session_destroy() gibi bir metodu da yok ???? Ancak şöyle bir üst bilgi ile çıkışı sağlayabiliriz;

header('HTTP/1.1 401 Unauthorized');

Yani bunu herhangi bir logout.php gibi dosyaya ekleyip çıkış işlemini oraya yönlendirirsek otomatik olarak çıkış yapmış sayılacaktır.

Sınıf haline getirmek

Hızlı ve kolay kullanım için yukarıdaki kodlarımızı hemen basit bir sınıf haline getirelim.

class Auth {

    public static function Login($username, $password)
    {
        $inputUsername = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : false;
        $inputPassword = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : false;
        $validated = ($inputUsername == $username) && ($inputPassword == $password);
        if (!$validated) {
            header('WWW-Authenticate: Basic');
            header('HTTP/1.0 401 Unauthorized');
            die('Girmek için yetkiniz bulunmuyor!');
        }
        return true;
    }

    public static function Logout()
    {
        header('HTTP/1.1 401 Unauthorized');
    }


}

Artık kullanırken şu şekilde bir kullanım ile kolayca kullanabiliriz;

$auth = Auth::Login('erbilen', '123123');
if ( $auth ){
    echo 'Hoşgeldiniz!';
}

Başka bir yazıda görüşmek üzere ????

Php ile Sınırsız Parametre Göndermek (Sef Linke Uygun)

Php ile istediğimiz kadar parametre gönderip, kısa yoldan bu parametleri nasıl kullanacağımızı öğreneceğiz.

Derste Kullandığım Fonksiyonların Açıklamaları;

– function_exists() => Bir fonksiyonun olup olmadığını kontrol eder. Varsa true, yoksa false değerini döndürür.
– call_user_func() => Bir fonksiyon çalıştırır, fonksiyona parametre gönderir.
– array_filter() => Dizi elemanlarını filtrelemek için kullanılır. Biz dersimizde boş değerleri kaldırmak için kullandık.
– explode() => Bir string ifadeyi, girilen karaktere göre parçalayıp dizi halinde bize geriye döndürür.

İndir;
http://yadi.sk/d/XxWkx2lQ2VU3l

PHP gzcompress() ve gzuncompress() Fonksiyonları

Ne zaman sıkıştırmaktan bahsetsek, aklımız hep dosyaları sıkıştırmaya gidiyor, mesela ZIP dosyaları gibi. Ancak PHP’de uzun string ifadeleri de sıkıştırmanın bazı yolları var. Bu işlem için ise gzcompress() fonksiyonu kullanılıyor.

gzcompress()

Uzun string ifadeleri sıkıştırmak için kullanılır. Örnek vermek gerekirse;

$string = '1993 yılının Ocak ayında Eskişehir‘de dünyaya gözlerimi açtım. Sakin bir çocukluk geçirdikten sonra gençliğimin bir bölümünü oyunlara harcadım. Daha sonra front-end ile tanıştım ve uzun yıllar (halen) front-end olarak profesyonel çalışmalar yaptım (yapmaktayım). Front-end yanında birde back-end desteğimin olmasını istediğim için çeşitli yazılım dilleri ile bir çok profesyonel yazılım geliştirdim (hala geliştirmekteyim). 1993 yılının Ocak ayında Eskişehir‘de dünyaya gözlerimi açtım. Sakin bir çocukluk geçirdikten sonra gençliğimin bir bölümünü oyunlara harcadım. Daha sonra front-end ile tanıştım ve uzun yıllar (halen) front-end olarak profesyonel çalışmalar yaptım (yapmaktayım). Front-end yanında birde back-end desteğimin olmasını istediğim için çeşitli yazılım dilleri ile bir çok profesyonel yazılım geliştirdim (hala geliştirmekteyim).';
 
$compressed = gzcompress($string);

// Orijinal Boyutu: 935 
echo 'Orijinal Boyutu: '. strlen($string);

// Sıkıştırılmış Boyutu: 311
echo 'Sıkıştırılmış Boyutu: '. strlen($compressed);

gzuncompress()

Bu işlemi geri almak içinse bu fonksiyon kullanılır. Yukarıdaki örneğin devamı olarak şöyle örnek verelim;

$original = gzuncompress($compressed);

// Orijinal Boyutu: 935
echo 'Orijinal Boyutu: '. strlen($original);

PHP serialize() ve unserialize() Fonksiyonları

PHP’de hiç kompleks bir değişkeni veritabanında ya da dosyalarda saklamak istediniz mi? Örneğin tipi array olan bir değişkeni veritabanında saklamak istiyoruz. İşte bunu serialize() fonksiyonu ile yapmamız mümkün.

serialize()

Şimdi kompleks bir dizimizi saklayacak hale getirelim.

$arr = [
	'Tayfun Erbilen',
	'site' => 'http://erbilen.net',
	1993,
	[
		'ad' => 'Tayfun',
		'soyad' => 'Erbilen'
	]
];

$data = serialize($arr);
echo $data;

/*
a:4:{i:0;s:14:"Tayfun Erbilen";s:4:"site";s:18:"http://erbilen.net";i:1;i:1993;i:2;a:2:{s:2:"ad";s:6:"Tayfun";s:5:"soyad";s:7:"Erbilen";}}
*/

unserialize()

Serialize ettiğimiz datayı tekrar eski orijinal haline getirmek istersekte şöyle yapacağız;

$arr = [
 'Tayfun Erbilen',
 'site' => 'http://erbilen.net',
 1993,
 [
 'ad' => 'Tayfun',
 'soyad' => 'Erbilen'
 ]
];

$data = serialize($arr);
echo $data;

/*
a:4:{i:0;s:14:"Tayfun Erbilen";s:4:"site";s:18:"http://erbilen.net";i:1;i:1993;i:2;a:2:{s:2:"ad";s:6:"Tayfun";s:5:"soyad";s:7:"Erbilen";}}
*/

$array = unserialize($data);
print_r($array);

/*
(
    [0] => Tayfun Erbilen
    [site] => http://erbilen.net
    [1] => 1993
    [2] => Array
         (
             [ad] => Tayfun
             [soyad] => Erbilen
         )
)
*/

İşte bu şekilde kompleks verilerinizi veritabanında saklayabilirsiniz.

Bu işlemi ayrıca json_encode() ve json_decode() fonksiyonları ilede yapabilirsiniz. Merak edenler buraya tıklayıp inceleyebilir.

PHP glob() Fonksiyonu

PHP’de sevdiğim ve yararlandığım bir fonksiyon var. Bu fonksiyonun adı glob() 

Fonksiyon ne işe yarıyor?

Dizin içerisinde eşleşen dosyaları bulmamızı sağlıyor. Örneğin kolayca tüm php dosyalarını bulabiliriz. Şöyle ki;

// Dizindeki tüm php dosyalarını bul
$files = glob('*.php');

print_r($files);
/*
Array
(
    [0] => _index.php
    [1] => ip.php
)
*/

Ya da bir başka örnek, birden fazla uzantılı dosyaları şu şekilde bulabiliriz;

// Dizindeki tüm php ve css dosyalarını bul
$files = glob('*.{php,css}', GLOB_BRACE);

print_r($files);

/*
Array
(
    [0] => _index.php
    [1] => ip.php
    [2] => bitnami.css
    [3] => style.css
)
*/

İsterseniz bulunduğunuz dizini değil, kendiniz dizin ayarlayarakta listeleme yapabilirsiniz. Örneğin;

// animalpedia dizinindeki tüm html dosyalarını bul
$files = glob('animalpedia/*.html');

print_r($files);

/*
Array
(
    [0] => animalpedia/alt.html
    [1] => animalpedia/index2.html
)
*/

Tam dosya adreslerini almak isterseniz array_map() fonksiyonu ile realpath() uygulamak yeterli olacaktır. Şöyle ki;

// animalpedia dizinindeki tüm html dosyalarını bul
$files = glob('animalpedia/*.html');

$files = array_map('realpath', $files);

print_r($files);
/*
Array
(
    [0] => /Applications/XAMPP/xamppfiles/htdocs/animalpedia/alt.html
    [1] => /Applications/XAMPP/xamppfiles/htdocs/animalpedia/index2.html
)
*/

İşte bu kadar ????

Sonuç olarak bu fonksiyonu kullanacağınız bir çok yer olacağına eminim. Bilmiyorsanız öğrendiniz, biliyorsanız pekiştirdiniz. Bir başka fonksiyon anlatımında görüşürüz ^^

PHP ile Hex Renk Kodunun Doğruluğunu Kontrol Etmek

Girilen renk değerinin hex olup olmadığını doğrulamam gerekiyordu. Ufak bir araştırma sonucunda ise aşağıdaki kodlar ile doğrulama işlemi yaptım. Birgün size de lazım olabilir diye paylaşıyorum.

$color = 'fa6582';
if (ctype_xdigit($color) && (strlen($color) == 6 || strlen($color) == 3)){
   echo 'geçerli hex renk kodu';
} else {
   echo 'geçersiz bir hex kodu';
}

kolay gelsin ????