WordPress'in bir blog platformundan tam teşekküllü bir CMS'ye geçişi, aynı zamanda geliştiricilerin olağanüstü projeler ve uygulamalar geliştirmeleri için katı bir çerçeveye dönüştürür.

WordPress çekirdeği, yalnızca kullanıcıların yayınlama motorunu değil, aynı zamanda geliştiricilere geniş bir yelpazedeki ihtiyaçları karşılayacak şekilde tasarlanmış güçlü bir sınıf, API ve yardımcı seti sunar.

WordPress'in gizli mücevherlerinden biri, geliştiricilerin yerel dosya sistemi ile güvenli ve sağlam bir şekilde işlem yapabilmelerini sağlayan WordPress Dosya Sistemi API'sidir. Bu dosya manipülasyon işlevselliğini sık sık istenen yöntemlerin bir dizi içine soyutlar böylece farklı barındırma ortamlarında güvenle kullanılabilir.

Sorunun kapsamı

Yerel dosyaları kodda yazmak isteyen birkaç sebep olabilir:

  • Olayların veya gerçekleştirilen işlemlerin günlüğe kaydedilmesi
  • WordPress destekli olmayan sistemlerle veri değişimi
  • yedek

Motivasyonlardan bağımsız olarak, yerel dosyaları PHP kodundan yazmak riskli bir işlem olabilir. Bir WordPress teması, eklenti veya özel yükleme için bunu uygularken en az iki önemli tuzak dikkate alınmalıdır:

  1. Güvenlik. Yerel dosyaları kod ile yazarken (web sunucusu tarafından) yanlış dosya sahipliği riski vardır. Bu sorun, kötü yapılandırılmış paylaşılan barındırma ortamlarında ortaya çıkar ve dosyalar üzerinde denetimin kaybolmasına neden olabilir.
  2. Uyumluluk. Orada barındırma şirketlerinin çeşitliliği nedeniyle, belirli bir kullanıcının sunucu yapılandırması genellikle geliştirici tarafından bilinmemektedir. Bu nedenle geliştirici, bir yazım işlemi için gerekli izinlerin eklenti veya tema kullanıcısı tarafından erişilebilir olduğundan emin olamaz.

Yerel dosyaları yazması gereken bir WordPress eklentisi veya teması, kamu yayınına yönelikse, geliştirici sürekli olarak bu sorunları göz önünde bulundurmalıdır. İyi haber şu ki, WordPress'in zaten bu problemleri çözmek için bir aracı var: Dosya Sistemi API'sı.

WordPress Dosya Sistemi API'sine Giriş

WordPress'in kendi güncelleme özelliğini etkinleştirmek için Dosya Sistemi API'sı, sürüm 2.6'da WordPress'e eklendi. Okuma / yazma işlemlerini güvenli bir şekilde ve çeşitli ana bilgisayar türlerinde gerçekleştirmek için gereken işlevselliği özetlemektedir. Bir dizi sınıftan oluşur ve tek tek ana bilgisayar kurulumuna bağlı olarak yerel dosya sistemine bağlanmanın uygun yolunu otomatik olarak seçmenize izin verir.

API'nin arkasındaki mantık oldukça basittir; Yerel dosyaları doğrudan yazmaya çalışır ve yanlış dosya sahipliği durumunda başka bir FTP tabanlı yönteme geçer. Kullanılabilir PHP kitaplıklarına bağlı olarak, bir FTP bağlantısı (genişletme soketleri veya SSH üzerinden) kurmak için uygun bir yol bulur. Genellikle, yerel dosyalarla çalışmak için aşağıdaki adımlar gereklidir:

Adım 1. Hangi bağlantı yönteminin mevcut olduğunu algıla

WordPress, aşağıdaki yöntemlerin kullanılabilirliğini saptamak için get_filesystem_method işlevini kullanır (en yüksek öncelikten en düşüğe doğru) Direct, SSH2, FTP PHP Uzantısı, FTP Yuvaları.

2. Adım. Algılanan yöntem için gerekli kimlik bilgilerini alın.

Algılanan aktarım bir kullanıcıdan kimlik bilgisine ihtiyaç duyarsa, WordPress istek formunu görüntülemek için request_filesystem_credentials işlevini kullanır. İşlev, form gönderimleri arasında veriyi korumasına, bağlantı başarısız olduğunda birkaç kez kimlik bilgilerini sormasına ve WordPress yüklemesinin içindeki belirli bir dizine hedeflenmesine izin veren bir dizi parametreye sahiptir:

request_filesystem_credentials($form_post, $type, $error, $context, $extra_fields);

Fonksiyona boş bir $ tip parametresi sağlayarak mevcut bağlantı yöntemlerinin tespitini gerçekleştirmek için zorlayabiliriz, bu yüzden bizim için get_filesystem_method olarak adlandırılır. Aynı zamanda işlevi, herhangi bir bağlantı türünü $ type argümanı kullanarak belirterek kullanmaya zorlayabiliriz.

Seçilen yöntemin gerektirdiği bağlantı verileri sağlanmadığında, işlev isteği talep etmek için formu yazdırır:

Conneciton information

İlk istekten sonra WordPress, gelecekteki kullanım için veritabanındaki FTP ana bilgisayar adını ve kullanıcı adını saklar, ancak şifreyi saklamaz. Alternatif olarak, FTP kimlik bilgileri aşağıdaki sabitleri kullanarak wp-config.php dosyasında belirtilebilir:

  • FTP_HOST - bağlanacak sunucunun ana bilgisayar adı
  • FTP_USER - bağlanacak kullanıcı adı
  • FTP_PASS - ile bağlanacak şifre
  • FTP_PUBKEY - SSH2 bağlantısı için kullanılacak Genel Anahtar yoludur
  • FTP_PRIKEY - SSH2 bağlantısı için kullanılacak Özel Anahtarın yolu

Bu veriler wp-config.php dosyasında saklandığında, kimlik bilgileri talep formu görünmez, ancak güvenlik dezavantajları önemlidir ve güvenlik prosedürleri mümkün olan en yüksek dikkatle üç kez kontrol edilmeli ve bu dosyanın güvenliğine ödenmelidir.

Adım 3. WordPress Filesystem sınıfını başlatın ve dosya sistemine bağlanın

WordPress Dosya Sistemi API'sinin kalbi WP_Filesystem işlevidir. Uygun taşıma sınıfını yükler ve başlatır, elde edilen örneği daha fazla kullanım için global $ wp_filesystem nesnesine kaydeder ve sağlanan kimlik bilgileriyle dosya sistemine bağlanmaya çalışır:

WP_Filesystem($args, $context);

Adım 4. Okuma / yazma işlemlerini gerçekleştirmek için WordPress Dosya Sistemi yöntemlerini kullanın.

Düzgün olarak başlatılmış bir $ wp_filesystem nesnesi, bağlantı türü hakkında herhangi bir endişe duymadan kullanılabilecek yerel dosya sistemiyle iletişim kuracak bir yöntem kümesine sahiptir. Özellikle, yaygın olarak kullanılan yöntemler şunlardır:

  • get_contents - dosyayı bir dizeye okur
  • put_contents - bir dosyaya bir dize yazar
  • mkdir - bir dizin oluşturur
  • mdir - bir dizini kaldırır
  • wp_content_dir - yerel dosya sistemindeki yolu wp-content klasörüne döndürür
  • wp_plugins_dir - yerel dosya sistemindeki yolu eklenti klasörüne döndürür
  • wp_themes_dir - Yerel dosya sistemindeki yolu temalar klasörüne döndürür

Hepsini bir araya getirerek, basit bir durumda yukarıda belirtilen adımları yerine getiren bir örnek bulalım. Bir metin içinde bir metin yazıp bir .txt dosyasına yazacağız.

Bu örneğin gösterim amaçlı olduğunu, gerçek dünyadaki bir durumda .txt dosyasında basit metin verilerini saklayamayacağınızı, bunun yerine veritabanında saklamak için çok daha güçlü bir çözüm olacağını unutmayın.

WordPress Dosya Sistemi API'si etkin

Kodumuzu kendi dosya sistemi-demo klasörüne tahsis edecek ayrı bir eklentiye koyalım. Bu bize .txt dosyasını depolamak ve yazma izinlerini kontrol etmek için hedef klasör sağlar.

Her şeyden önce, Araçlar menüsünün altındaki formumuzu görüntülemek için demo sayfasını oluşturalım:

/*** Create Demo page (under Tools menu)***/add_action('admin_menu', 'filesystem_demo_page');function filesystem_demo_page() {add_submenu_page( 'tools.php', 'Filesystem API Demo page', 'Filesystem Demo', 'upload_files', 'filesystem_demo', 'filesystem_demo_screen' );}function filesystem_demo_screen() {$form_url = "tools.php?page=filesystem_demo";$output = $error = '';/*** write submitted text into file (if any)* or read the text from file - if there is no submission**/if(isset($_POST['demotext'])){//new submissionif(false === ($output = filesystem_demo_text_write($form_url))){return; //we are displaying credentials form - no need for further processing}  elseif (is_wp_error ($ çıkış)) {$error = $output->get_error_message();$output = '';}  } else {// dosyadan oku (false === ($ output = dosya sistemi_demo_text_read ($ form_url))) {return;  // daha fazla işlemeye gerek kalmadan kimlik bilgilerini gösteriyoruz} elseif (is_wp_error ($ output)) {$error = $output->get_error_message();$output = '';}  } $ output = esc_textarea ($ çıktı);  // yazdırmak için kaçmak mı?> 

Dosya sistemi API'sı Deneme sayfası

Sayfamızı görüntülerken (filesystem_demo_screen) metin gönderiminin kullanılabilirliğini kontrol ederiz. Varsa, bir test.txt dosyasına yazmayı deneriz, aksi takdirde, böyle bir dosyayı eklenti klasöründe bulmaya çalışırız ve içeriğini içeriklerini textarea'da içerecek şekilde okuruz. Son olarak, giriş metnine temel bir form yazdırıyoruz. Okunabilirlik uğruna bu yazma ve okuma işlemleri kendi işlevlerine ayrıldı.

Filesystem API demo

Aynı başlatma adımlarının çoğaltılmasını önlemek için paylaşılan yardımcı oluşturuldu. Mevcut bağlantı yöntemini tespit etmek ve kimlik bilgilerini almak için request_filesystem_credentials öğesini çağırır. Bu başarılı olsaydı, WP_Filesystem'ı verilen verilerle $ wp_filesystem'i başlatmaya çağırır.

/*** Initialize Filesystem object** @param str $form_url - URL of the page to display request form* @param str $method - connection method* @param str $context - destination folder* @param array $fields - fileds of $_POST array that should be preserved between screens* @return bool/str - false on failure, stored text on success**/function filesystem_init($form_url, $method, $context, $fields = null) {global $wp_filesystem;/* first attempt to get credentials */if (false === ($creds = request_filesystem_credentials($form_url, $method, false, $context, $fields))) {/*** if we comes here - we don't have credentials* so the request for them is displaying* no need for further processing**/return false;}/* now we got some credentials - try to use them*/if (!WP_Filesystem($creds)) {/* incorrect connection data - ask for credentials again, now with error message */request_filesystem_credentials($form_url, $method, true, $context);return false;}return true; //filesystem object successfully initiated}

Dosya koduna yazmak şöyle görünür:

/*** Perform writing into file** @param str $form_url - URL of the page to display request form* @return bool/str - false on failure, stored text on success**/function filesystem_demo_text_write($form_url){global $wp_filesystem;check_admin_referer('filesystem_demo_screen');$demotext = sanitize_text_field($_POST['demotext']); //sanitize the input$form_fields = array('demotext'); //fields that should be preserved across screens$method = ''; //leave this empty to perform test for 'direct' writing$context = WP_PLUGIN_DIR . '/filesystem-demo'; //target folder$form_url = wp_nonce_url($form_url, 'filesystem_demo_screen'); //page url with nonce valueif(!filesystem_init($form_url, $method, $context, $form_fields))return false; //stop further processign when request form is displaying/** now $wp_filesystem could be used* get correct target file first**/$target_dir = $wp_filesystem->find_folder($context);$target_file = trailingslashit($target_dir).'test.txt';/* write into file */if(!$wp_filesystem->put_contents($target_file, $demotext, FS_CHMOD_FILE))return new WP_Error('writing_error', 'Error when writing file'); //return error objectreturn $demotext;}

Bu bölümde bazı gerekli parametreleri tanımladık:

  • $ demotext - gönderilecek metin
  • $ form_fields - metnimizi saklayan ve korunmalı olan $ _POST dizisindeki öğe
  • $ method - ulaşım yöntemi, otomatik olarak tespit etmek için boş bırakıyoruz
  • $ context - hedef klasör (eklentinin bir tanesi)

Bundan sonra, daha önce açıkladığım yardımcı işlevini kullanarak global $ wp_filesystem nesnesini başlattık. Başarı durumunda hedef klasörün doğru yolunu tespit eder ve gönderilen metni $ wp_filesystem nesnesinin put_contents yöntemini kullanarak yazarız.

Dosyadan okunan kod şöyle görünüyor:

/*** Read text from file** @param str $form_url - URL of the page where request form will be displayed* @return bool/str - false on failure, stored text on success**/function filesystem_demo_text_read($form_url){global $wp_filesystem;$demotext = '';$form_url = wp_nonce_url($form_url, 'filesystem_demo_screen');$method = ''; //leave this empty to perform test for 'direct' writing$context = WP_PLUGIN_DIR . '/filesystem-demo'; //target folderif(!filesystem_init($form_url, $method, $context))return false; //stop further processing when request forms displaying/** now $wp_filesystem could be used* get correct target file first**/$target_dir = $wp_filesystem->find_folder($context);$target_file = trailingslashit($target_dir).'test.txt';/* read the file */if($wp_filesystem->exists($target_file)){ //check for existence$demotext = $wp_filesystem->get_contents($target_file);if(!$demotext)return new WP_Error('reading_error', 'Error when reading file'); //return error object}return $demotext;}

Bu işlev daha önce anlatıldığı gibi çalışır, ancak hedef dosyadan okumak için get_contents kullanır.

Sonuç

Yerel dosyalarla çalışırken, bir WordPress temaları veya eklenti geliştiricisi güvenlik ve uyumluluk sorunları ile temasa geçecek, ekip üzerinde büyük bir stres yaratacak ve proje yaşam döngüsüne uzun saatler ekleyecektir. Dosya sistemi API'sine dayanarak, bu problemler verimli bir şekilde yan basamaklara ayrılabilir. Bu yüzden, bir dahaki sefere, eklentinin koduna yazarken bulduğunuzda, bu alternatifi daha sağlıklı seçenek olarak düşünün.

Yapabilirsin bu kodun bir demosunu buradan indirebilirsiniz ve ihtiyaçlarınıza göre uyarlayın.