Membuat Slug, URL yang Sedap Dipandang

Situs Silsilah Keluarga yang saya kelola sedikit demi sedikit mulai berkembang. Terima kasih untuk para akang, ayi, dan palawargi yang satu demi satu menghubungi saya ingin ikut berkontribusi. Tentunya dengan semakin banyaknya kontributor, data silsilah keluarga kami akan semakin bertambah, lebih lengkap, dan lebih akurat.
Beberapa hal saya lakukan di situs Silsilah Keluarga ini untuk kenyamanan dan kemudahan para pengguna ataupun pengunjung. Salah satunya adalah slug. Ini adalah istilah yang sering kali dipakai untuk menamai URL yang ramah dan gampang dibaca.
Misalnya di blog ini. Alih-alih memiliki URL yang sulit diingat seperti http://priatna.or.id/?p=276 untuk sebuah artikel yang berjudul Saya Keren Banget Deh1, blog ini menampilkan, misalnya, http://priatna.or.id/saya-keren-banget-deh untuk artikel yang sama. Mesin WordPress sudah otomatis membuat slug dari judul artikel yang Anda buat dan tentu saja boleh diubah kemudian.
Bagaimana membuat itu terjadi di situs Silsilah Keluarga?

Menambah Ruas Slug

Selama ini, URL yang muncul ketika memunculkan data seorang anggota keluarga adalah seperti ini silsilah/people.php?person=ID. ID adalah nomor unik yang merujuk spesifik ke data orang tertentu. Tentunya akan lebih manis bila URL-nya dapat tampil seperti ini misalnya: silsilah/person/nama-orang. Lebih mudah diingat dan, konon, lebih ramah terhadap mesin pencari.
Hal pertama yang saya lakukan adalah membuat satu ruas khusus yang memuat informasi slug di tabel data saya. Untuk kasus saya, saya menyimpan data nama, alamat, tempat lahir, tanggal lahir, dan lain-lain di dalam sebuah tabel bernama people. Ke dalam tabel inilah saya tambahkan satu ruas lagi: slug.
Isi ruas slug saya bangun dari ruas name yang berisi nama, dengan menetapkan aturan: setiap spasi diganti dengan tanda hubung dan semua huruf kapital harus diubah menjadi huruf kecil.
Saya jalankan perintah berikut di mysql2:
UPDATE `people` SET slug = REPLACE(LCASE(name), ' ', '-');
Lalu perintah ini untuk membuang tanda titik.
UPDATE `people` SET slug = REPLACE(LCASE(slug), '. ', '');
Ruas slug kini berisi utas (record) seperti “arief-heryana”, “muhammad-iksir-abiyan”, dan lain-lain. Karena nantinya akan dipakai untuk merujuk ke data yang spesifik, ruas ini tentu saja harus unik. Di data yang saya miliki, ada beberapa nama yang sama sehingga slug-nya pun sama. Untung saja kasus ini tidak banyak sehingga saya bisa lakukan pengunikan secara manual: tambahkan “-1″, “-2″, dan seterusnya di belakang slug identik berikutnya.
Kemudian saya harus mengubah perujuk untuk menampilkan data orang, yang tadinya berdasarkan ID, sekarang harus berdasarkan slug. Jadi, kode permintaan pada URL saya ubah dari silsilah/people.php?person=ID menjadi silsilah/people.php?person=slug. Ini artinya saya harus pula mengubah beberapa baris kode di hampir semua berkas php saya3.

.htaccess

Setelah data orang dapat terpanggil dengan benar menggunakan perujuk slug, saatnya mengeluarkan senjata berikutnya: berkas .htaccess. Berkas ini digunakan oleh server Apache untuk mengatur dan merekayasa permintaan terhadap sebuah direktori di suatu situs web.
Dalam kasus saya, agar pengunjung situs dapat menggunakan alamat silsilah/person/ini-nama-saya, alih-alih silsilah/people.php?person=ini-nama-saya untuk mengakses data seseorang, saya membuat satu berkas .htaccess4 yang disimpan di folder silsilah. Isinya kurang lebih ini:
Options +FollowSymlinks
RewriteEngine on
RewriteBase /silsilah/
RewriteRule ^person/(.+)$ /silsilah/people.php?person=$1 [NC]
Baris di atas akan otomatis mengantar setiap permintaan terhadap http://priatna.or.id/silsilah/person/nama-orang ke http://priatna.or.id/silsilah/people.php?person=nama-orang tanpa disadari oleh pengunjung.
Sudah selesaikah? Belum! Sedikit lagi.

Slug Harus Unik dan Sederhana

Seperti sempat disinggung sebelumnya, ruas slug dibuat untuk mengidentifikasi data individu anggota keluarga—karenanya dia harus unik. Selain unik, slug juga harus sederhana. Saya ingin, hanya karakter abjad dan tanda hubung yang diperkenankan. Misalnya saja, slug untuk nama Rihhadatul ‘Aisyi akan berisi rihhadatul-aisyi tanpa tanda petik.
Bagaimana menjaga keunikan dan kesederhanaan ini?
Membangun slug dapat diatur dengan beberapa baris kode php berikut:
$slug = strtolower($name);
$slug = ereg_replace('([[:space:]]|-)+', '-', $slug);
$slug = ereg_replace('([^a-z0-9-]|-+$|^-+)', '', $slug);
Variabel $name berisi nama orang.
Baris pertama akan mengambil nama orang yang akan dibuatkan slug dan mengubah semua karakternya menjadi huruf kecil. Baris kedua akan mengubah spasi menjadi tanda hubung. Bila ada spasi atau tanda hubung ganda, dia pun akan diubah menjadi tanda hubung. Di baris ketiga, ada 3 jenis yang akan dibuang: semua karakter selain huruf, angka, dan tanda hubung; tanda hubung di awal; dan tanda hubung di akhir.
Setelah mendapatkan slug, saya harus menguji apakah slug ini unik? Bila ternyata sama dengan slug yang sudah ada, di belakang slug orang tersebut akan ditambahi “-1″ atau “-2″ tergantung banyaknya slug yang identik. Baris kodenya kira-kira seperti ini.
$query = "SELECT count(*) AS number FROM people WHERE slug = '".$slug."' OR slug REGEXP '^".$slug."-[0-9]'";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result))
    $total = $row["number"];
if ($total > 0)
    $slug = $slug."-".$total;
Baris-baris kode di atas akan memastikan slug yang dibuat adalah unik untuk setiap individu. Jika ada 3 nama Dadang, slug masing-masing adalah dadang, dadang-1, dan dadang-2.
Ketika ada pengguna yang memasukkan data anggota keluarga, ruas untuk slug tidak saya ditampilkan. Isi ruas ini akan otomatis dibangun dari nama anggota keluarga yang dimasukkan. Tapi ketika pengguna menyunting data seorang anggota keluarga yang sudah ada, isi ruas slug akan ditampilkan dan boleh diubah. Jika slug muhammad-haikal-ali-akbar-darul-haq dirasa terlalu panjang, pengguna dapat mengubahnya menjadi lebih ringkas seperti haikal-ali-akbar, misalnya. Setelah perubahan, slug ini akan tetap merujuk pada nama yang sama.
Selesai sudah. Mudah-mudahan tidak banyak bugs yang muncul akibat perubahahan ini. Dan kalau ada, saya akan senang jika diberi tahu.

0 komentar:

Posting Komentar