Ubuntuya Linux, Apache, MySQL, PHP (LAMP) Nasıl Yüklenir?

Ubuntu’ya Varsayılan LAMP Paketini Yüklemek

Eğer en kolay bir şekilde LAMP yüklemek istiyorsanız, aşağıdaki kodları terminalde yazmanız yeterlidir.

$ sudo apt-get update
$ sudo apt-get install lamp-server^

“^” karakterini yazmayı unutmayın, aksi takdirde hata verecektir.

Ubuntu’ya Linux, Apache, MySQL, PHP Yüklemek

Eğer hepsini ayrı ayrı yüklemek istiyorsanız, doğru yerdesiniz. Bu biraz daha uğraştırıcıdır ama size daha iyi bir kullanım ve istediğinizi yükleme olanağı sağlar.

Apache Yüklemek

Apache yüklemek için aşağıdaki kodları terminalde yazın.

sudo apt-get update
sudo apt-get install apache2

Bu kadar. Apache yüklendi. Kontrol etmek için web tarayıcınıza http://localhost adresini girin ve “It Works!” yazısını görürseniz sıkıntısız yüklenmiş demektir. Eğer vps sunucunuza kuruyorsanız vps’nizin ip adresinizi yazıp girmelisiniz tarayıcıdan.

MySQL Yüklemek

sudo apt-get install mysql-server

Her iki sürümün de yüklenmesi sırasında MySQL’in root kullanıcısı şifresini girmenizi isteyecektir sizden.

PHP Yüklemek

PHP yüklemek için terminale aşağıdaki kodları yazın.

sudo apt-get install php libapache2-mod-php php-mcrypt php-mysql

Bu kadar. PHP yüklendi.

PHP Modüllerini Yüklemek

Php modüllerini listelemek için aşağıdaki kodu terminale yazın.

apt-cache search php5-

Hangi modülü yüklemek istiyorsanız aşağıdaki gibi bir kod yazarak terminale yükleyebilirsiniz.

sudo apt-get modül ismi
sudo apt-get php5-cli

WordPress Güvenlik Önlemleri

WordPress Kurulum Esnasındaki Güvenlik Önlemleri

1) Veritabanı kullanıcı şifresini güçlü oluşturun. Büyük harf, küçük harf, sayı ve özel karakter içermeli.

2) Veritabanı ismi ve kullanıcı ismi basit ve tahmin edilebilecek isimler yani database, db, admin, veritabanı gibi isimler olmasın.

3) WordPress, kurulum ekranında bir ön eki sormaktadır. Varsayılan olarak wp_ ön eki vardır. Bu veritabanındaki tabloların en ekidir. Varsayılandan farklı bir ön eki kullanın.

4) Kullanıcı adı ve şifre seçiminde admin, administrator’den farklı bir isim seçin. Bunlar varsayılan olduğu için ilk olarak denenmektedir. Aynı şekilde şifreyi de büyük harf, küçük harf, sayı ve özel karakter içerek şekilde oluşturun ki güçlü olsun. Mail adresi admin@siteadi.com gibi admin içeren bir mail olmasın.

WordPress Kurulumdan Sonraki Güvenlik Önlemleri

1) .htaccess dosyanıza aşağıdaki kodları ekleyin.

# .htaccess dosyasına erişimi engelle
<files .htaccess>
order allow,deny
deny from all
</files>
# sunucu imzasını kaldır
ServerSignature Off
# dosya yükleme boyutunu 10mb ile sınırlandır
LimitRequestBody 10240000
# wpconfig.php dosyasına erişimi engelle
<files wp-config.php>
order allow,deny
deny from all
</files>
# wp-load.php dosyasına erişimi engelle
<files wp-load.php>
order allow,deny
deny from all
</files>
# dizin listelemeyi iptal et
Options All -Indexes

2) wp-config.php dosyasında eşsiz anahtarlar kısmı denen bir yer vardır. Eğer oraya hiç dokunmadıysanız aşağıdaki gibi bir görünümle karşılaşacaksınız.

define('AUTH_KEY', 'eşsiz karakter kümenizi buraya yerleştirin');
define('SECURE_AUTH_KEY', 'eşsiz karakter kümenizi buraya yerleştirin');
define('LOGGED_IN_KEY', 'eşsiz karakter kümenizi buraya yerleştirin');
define('NONCE_KEY', 'eşsiz karakter kümenizi buraya yerleştirin');
define('AUTH_SALT', 'eşsiz karakter kümenizi buraya yerleştirin');
define('SECURE_AUTH_SALT', 'eşsiz karakter kümenizi buraya yerleştirin');
define('LOGGED_IN_SALT', 'eşsiz karakter kümenizi buraya yerleştirin');
define('NONCE_SALT', 'eşsiz karakter kümenizi buraya yerleştirin');

Burası çok önemlidir. Cookie ve parola kayıtlarını bunlarla şifrelemektedir. Buraya ekleyeceğiniz kodlar için http://api.wordpress.org/secret-key/1.1/salt adresini ziyaret ettiğinizde WordPress size gerekli kodları verecektir. Kopyalayıp yapıştırmanız yeterlidir.

3) Eklentileri mümkün olduğunca az kullanın. Hem sitenizi yavaşlatacaklardır hem de saldırıya açık olma durumlarını artıracaklardır.

4) Tema ve eklentileri mümkün olduğunca WordPress gibi güvenilir kaynaklardan edinin ya da siz yazın. Warez tema ya da eklentileri kesinlikle kullanmayın.

5) Bu yazımdaki güvenlik açığını kapatın.

En önemlisi ise WordPress‘inizi devamlı güncelleyin.

WordPress Xmlrpc Açığı Ve Çözümü

WordPress‘de mevcut olan bir açık vardır. Xmlrpc.php dosyası üzerinden saldırılar gerçekleşebiliyor. Normalde sadece POST ile gönderilen veriler varsa çalışan bu dosya kötü amaçlı kullanılabiliyor. DDoS saldırıları yapılabiliyor.

Açık olup olmadığını anlamak için sitenizde şöyle bir url’ye gidin “www.siteniz.com/xmlrpc.php”. Eğer aşağıdaki resimdeki gibi bir sonuç alıyorsanız sizde de bu açık mevcut demektir.

xmlrpc-securityBu açığı kapatmak için ise .htaccess dosyanıza aşağıdaki kodları eklemeniz yeterlidir.

# Begin Protect xmlrpc
RedirectMatch 403 /xmlrpc.php
# End Protect xmlrpc.php

WordPress Yazı Sürümlerini Silmek, Kapatmak

WordPress yazı sürümleri denilen bir özellik bulunmaktadır. Yayınladığınız bir yazınızda değişiklik yaptığınızda her değişiklikten önceki sürümünü ayrı bir şekilde kayıtlı tutmaktadır. Fakat bu bazen sinir bozucu ve zararlı olabilmektedir. Mesela bir yazıda 10 kez değişiklik yaptığınızda, 10 adet eski yazı sürümü olacaktır. Sitenizin içeriği arttıkça veritabanınızın şişmesine ve yavaşlamasına sebep olacaktır. Bundan dolayı burada size bu sürümleri silmeyi, kapatmayı ve limit koymayı göstereceğim.

WordPress Yazı Sürümlerini Kapatmak

WordPress yazı sürümlerini kapatmak için wp-config.php dosyanıza aşağıdaki kodu yerleştirmeniz yeterli olacaktır. Bu kodu, <?php ve ?> tagları arasında boş bir satıra eklemeyi unutmayın.

define('WP_POST_REVISIONS', false);

WordPress Yazı Sürümlerine Limit Koymak

WordPress yazı sürümlerine limit koymak için gene wp-config.php dosyanıza aşağıdaki kodu yerleştirmeniz yeterli olacaktır. Sayısını istediğiniz şekilde belirleyebilirsiniz. Burada son 3 sürüm olarak limit konmuştur.

define('WP_POST_REVISIONS', 3);

WordPress Yazı Sürümlerini Silmek

WordPress yazı sürümlerinizi veri tabanından temizlemek için basit bir yol bulunmaktadır. Çoğu yerde bunu eklentilerle yaptırsalar da ben bunu doğru bulmamaktayım. WordPress’i en az eklenti ile kullanmak en mantıklı olanıdır.

Aşağıdaki sql sorgusunu ister phpMyAdmin üzerinde çalıştırın isterseniz başka yöntemler kullanın farketmez. Yazı sürümleri silinecektir.

DELETE a,b,c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision'

Sosyal Medya Paylaşım Butonları Nasıl Eklenir

Bu makalede temanıza sosyal medya paylaşım butonlarının nasıl eklenebileceğini anlatacağım. Ekleyeceğiniz tema ister html ister wordpress olsun farketmeyecek. Buradaki tüm kodlar sosyal medya platformlarının developers sayfalarından alınmadır. Oraya da bakabilirsiniz.

Facebook Paylaşım Butonu

Bu kodda data-href=”” parametresinin değerini değiştirmeniz gerekmekte. Orada site urlsi yazmalı. Eğer wordpress kullanıyorsanız <?php the_permalink() ?> yazabilirsiniz. 

<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/tr_TR/sdk.js#xfbml=1&version=v2.4";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
<div class="fb-share-button" data-href="http://www.sitenizinurlsi.com" data-layout="button_count"></div>

Twitter Tweet Butonu

Bu kodda data-href=”” parametresinin değerini değiştirmeniz gerekmekte. Orada site urlsi yazmalı. Eğer wordpress kullanıyorsanız <?php the_permalink() ?> yazabilirsiniz.  Aynı zamanda data-text=”” parametresinin değerini de değiştirmeniz gerekmekte. Orada da sayfa başlığı yer almalı. Eğer tweet içerisine via kısmı yani şu aracılığı ile paylaşılmıştır anlamına gelen bir yazı eklemek istiyorsanız data-via=”” parametresine içinde değeri (mesela twitter kullanıcı adınız) olacak şekilde yazabilirsiniz.  

<div style="display:inline-block;vertical-align:top">
<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.sitenizinurlsi.com" data-text="Sitenizin Başlığı"> Tweet</a>
<script>!function (d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], p = /^http:/.test(d.location) ? 'http' : 'https'; if (!d.getElementById(id)) { js = d.createElement(s); js.id = id; js.src = p + '://platform.twitter.com/widgets.js'; fjs.parentNode.insertBefore(js, fjs); } }(document, 'script', 'twitter-wjs');
</script>
</div>

Pinterest Pin Butonu

Bunda herhangi bir değişiklik yapmanıza gerek yok. Sadece şunu unutmamalısınız, orada eklenen javascript dosyası sayfada sadece bir kere eklenmiş olmalı.

<div style="display:inline-block;vertical-align:top">
<a href="//www.pinterest.com/pin/create/button/" data-pin-do="buttonBookmark" data-pin-color="red"><img src="//assets.pinterest.com/images/pidgets/pinit_fg_en_rect_red_20.png" /></a>
<script type="text/javascript" async defer src="//assets.pinterest.com/js/pinit.js"></script>
</div>

Linkedin Paylaşım Butonu

Burada da herhangi bir değişiklik yapmanıza gerek yok.

<div style="display:inline-block;vertical-align:top">
<script src="//platform.linkedin.com/in.js" type="text/javascript"> lang: en_US</script>
<script type="IN/Share" data-counter="right"></script>
</div>

Google +1 Butonu

Bu kodda data-href=”” parametresinin değerini değiştirmeniz gerekmekte. Orada site urlsi yazmalı. Eğer wordpress kullanıyorsanız <?php the_permalink() ?> yazabilirsiniz.

<div style="display:inline-block;vertical-align:top">
<script src="https://apis.google.com/js/platform.js" async defer></script>
<a class="g-plusone" data-size="medium" data-href="http://www.sitenizinurlsi.com"></a>
</div>

WordPress Temasına Pluginsiz Sonsuz Scroll Ekleme

Bu yazımda size wordpress temasına plugin kullanmadan sonsuz scroll eklemeyi anlatacağım. Bu yazım makale en doğru makale olacaktır. Çünkü daha önce kendim sonsuz scroll eklemek için araştırm yaptığımda ya plugin kullanılarak anlatan makaleler ya da index.php dosyasında çalışan ama category.php ya da author.php gibi dosyalarında doğru çalışmayan yöntemler anlatan makaleler bulmuştum.  Diğer dosyalarda doğru çalışmıyorlardı. Çünkü örnek verirsem kategori dosyasında 2. sayfa ve sonrasının yazılarını yüklerken kategoriye göre yüklemiyordu. Tüm sayfaları yüklüyordu.

Bu işlemleri yaparken AdminLteWpTheme‘nin kaynak kodlarına bakabilirsiniz. Orada bunun çalışan halinin kodları mevcuttur.

Öncelikle aşağıdaki kodları functions.php dosyasına ekliyoruz.

//Infinite Scroll
function wp_infinitepaginate(){
 $loopFile = $_POST['loop_file'];
 $paged = $_POST['page_no'];
 $action = $_POST['what'];
 $value = $_POST['value'];
 
 if($action == 'author_name'){
 $arg = array('author_name' => $value, 'paged' => $paged, 'post_status' => 'publish' );
 }elseif($action == 'category_name'){
 $arg = array('category_name' => $value, 'paged' => $paged, 'post_status' => 'publish' );
 }elseif($action == 'search'){
 $arg = array('s' => $value, 'paged' => $paged, 'post_status' => 'publish' );
 }else{
 $arg = array('paged' => $paged, 'post_status' => 'publish');
 }
 # Load the posts
 query_posts( $arg );
 get_template_part( $loopFile );
 
 exit;
}
add_action('wp_ajax_infinite_scroll', 'wp_infinitepaginate'); // for logged in user
add_action('wp_ajax_nopriv_infinite_scroll', 'wp_infinitepaginate'); // if user not logged in

Bir ajax isteği geldiği zaman bu fonksiyonumuz çalışacak, loop oluşturacak ve loop dosyamızı çağıracaktır. Fonksiyonumuzda bazı POST verileri alıyoruz.

“loop_file” bizim loop dosyamızın ismidir. Bu dosyamız html kodlarını oluşturacaktır. Daha sonra ise javascript ile append edeceğiz.

“page_no” sayfa numarasıdır. Bununla hangi sayfanın yazılarını çekeceğimizi belirliyoruz.

“what” ise neye göre sayfaları istediğimizdir. Kategori mi, yazar mı, arama mı gibi.

“value” ise eğer kategori, yazar gibi isteklerde kategori slug ismi, yazar nicename gibi veriyi içerir.

If sorgulaması ile burada ne istediğimize göre query_posts için parametrelerimizi oluşturuyoruz. Daha sonra query_posts ile loop oluşturulup get_template_part ile loop dosyamızı çağırıyoruz.

add_function fonksiyonları ile wp-admin/wp-ajax.php‘ye bir ajax isteği yollandığın fonksiyonumuzun çalıştırılmasını sağlıyoruz. Ajax isteği yollarken action postu içerisinde infinite_scroll gönderiyoruz. Yani başka isimler ve fonksiyonlar ile farklı farklı ajax işlemleri oluşturabilirsiniz.

Daha sonra ise loop dosyamızı oluşturacağız. İsmini burada istediğiniz gibi verebilirsiniz ama unutmayın, “loop_file” postunda onun ismini göndermelisiniz. Ben loop.php ismini verdim. Burada index.php dosyasından direk loopunuzu kopyalayabilirsiniz. Ben AdminLteWpTheme‘nin içindekinden örnek olarak koyuyorum buraya.

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
 <!-- timeline time label -->
<li class="time-label">
 <span class="bg-green"><?php the_time('d.m.Y ') ?></span>
 </li>
 <!-- /.timeline-label -->
 <!-- timeline item -->
<li>
 <i class="fa fa-newspaper-o bg-blue"></i>
<div class="timeline-item">
 <span class="time"><i class="fa fa-clock-o"></i> <?php the_time('H:i') ?></span>
<h3 class="timeline-header"><a href="<?php the_permalink() ?>" alt="<?php the_title(); ?>" title="<?php the_title(); ?> "><?php the_title(); ?></a></h3>
<div class="timeline-body">
<div class="row">
<div class="col-lg-3 col-sm-4 col-xs-6">
 <a href="<?php the_permalink() ?>" title="<?php the_title(); ?>">
 <?php $resim_yolu = wp_get_attachment_image_src( get_post_thumbnail_id(), 'medium'); if ( has_post_thumbnail() ) { ?>
 
 <img src="<?php echo $resim_yolu[0]; ?>" class="img-responsive" alt="<?php the_title(); ?>" title="<?php the_title() ?>" />
 <?php } ?>
 </a>
 </div>
<div class="col-lg-9 col-sm-8 col-xs-6">
 <?php the_excerpt_rss(); ?>
<div style="margin-top: 10px">
 <a class="btn btn-primary btn-xs" href="<?php the_permalink() ?>" title="<?php the_title(); ?>">Read more</a>
 </div>
 </div>
 </div>
 </div>
<div class="timeline-footer">
 <i class="fa fa-user"></i> <a href="<?php echo esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ); ?>" title="<?php the_author(); ?>"><?php the_author(); ?></a> | <i class="fa fa-folder-open"></i> <?php the_category(', ') ?> | <i class="fa fa-comments"></i> <?php comments_number('0 comment', '1 comment', '% comments' );?>
 </div>
 </div>
 </li>
 <!-- END timeline item -->
 <?php endwhile; ?>
<?php endif; ?>

En son olarak da index.php, category.php gibi dosyalarımızda javascript kodlarımızı yazmalıyız.

<script type="text/javascript">
 jQuery(document).ready(function($) {
 var count = 2;
 var total = <?php echo $wp_query->max_num_pages; ?>;
 $(window).scroll(function(){
 if ($(window).scrollTop() == $(document).height() - $(window).height()){
 if (count > total){
 return false;
 }else{
 loadArticle(count);
 }
 count++;
 }
 });
 
 function loadArticle(pageNumber){
 $('a#inifiniteLoader').show('fast');
 $.ajax({
 url: "<?php echo admin_url(); ?>admin-ajax.php",
 type:'POST',
 data: "action=infinite_scroll&page_no="+ pageNumber + '&loop_file=loop',
 success: function (html) {
 $('li#inifiniteLoader').hide('1000');
 $("ul.timeline").append(html);
 }
 });
 return false;
 }
 
 });
</script>

Count değişkeni bizim sayfa numaramızdır. İlk başta 2 çünkü ilk başta 2. sayfanın yazıları yüklenecek. Her ajax isteğinde bir sayı artırılmakta. Total değişkenimiz ise toplam sayfa sayımızdır. Bu sayede her sayfa aşağıya indiğinde çalışmayacak şekilde ayarlayacağız.

$(window).scroll(function(){} ); fonksiyonu ile sayfa aşağıya inince ajax isteği göndermesini sağlayacağız ve count değişkenini bir artıracağız. Tabi count değişkenimiz total değişkenimizden daha büyük olduğu sürece diye bir If sorgusunu yazıyoruz ki gereğinden fazla çalışmasın.

loadarticle() fonksiyonumuz ile ilk başta yükleme iconunun gözükmesini sağlıyoruz. Daha sonra ise ajax isteğini göndermekte. data verisinde gönderilerek post verilerini inceleyebilirsiniz. Kategori, yazar gibi yerlerde de what ve value verilerini eklemeyi unutmuyoruz. Örnek olarak category.php dosyasındakini yazıyorum. Orada what ve value verilerini görebilirsiniz.

Umarım bu yazım işinize yaramıştır.

<script type="text/javascript">
 jQuery(document).ready(function ($) {
 var count = 2;
 var total = <?php echo $wp_query->max_num_pages; ?>;
 $(window).scroll(function () {
 if ($(window).scrollTop() == $(document).height() - $(window).height()) {
 if (count > total) {
 return false;
 } else {
 loadArticle(count);
 }
 count++;
 }
 });
 
 function loadArticle(pageNumber) {
 $('a#inifiniteLoader').show('fast');
 $.ajax({
 url: "<?php echo admin_url(); ?>admin-ajax.php",
 type: 'POST',
 data: "action=infinite_scroll&page_no=" + pageNumber + '&loop_file=loop&what=category_name&value=<?php echo $yourcat->slug; ?>',
 success: function (html) {
 $('li#inifiniteLoader').hide('1000');
 $("ul.timeline").append(html);
 }
 });
 return false;
 }
 
 });
</script>