Kendinizi Tekrar Etmeyin: Tekrarlayan Görevleri WP-CLI ile Otomatikleştirme

Yayınlanan: 2022-03-11

Temaları, eklentileri ve WP çekirdeğini güncellemek için kendinizi hiç WordPress yönetici alanına girerken buldunuz mu? Elbette var. "Bu CSV dosyasındaki tüm kullanıcıları oluşturabilir/güncelleyebilir/silebilir misiniz?" Eminim buna da rastlamışsınızdır. Bir siteyi taşımayı denediniz ve işi yapmak için ulaşabileceğiniz bir eklenti veya üçüncü taraf aracı olmasını dilediniz mi? sahip olduğumu biliyorum!

WP-CLI ile Tekrarlanan Görevleri Otomatikleştirme

Bu görevlerde ve daha fazlasında size yardımcı olacak çok güçlü bir araç var. Size bundan bahsetmeden önce, kısa bir anekdot kurmak istiyorum.

Sorun: Yakın tarihli bir projede, düzenli olarak tekrarlamam gereken birkaç programatik görev vardı. Özellikle bir görev, üyelik düzeyinde satın alma veya abonelik kanıtına dayalı olarak kullanıcı düzeyinde izinlerin güncellenmesini içeriyordu. Şirket, belirli bir üyelik seviyesi için kullanıcıdan bir ödeme bulamazsa, üyelik seviyesinin kullanıcıdan kaldırılmasını istedi. Buna neden ihtiyaç duyuldu? Belki bir üye bir aboneliği durdurdu, ancak bir etkinlik başlamadı ve bu nedenle üye, ödeme yapmamasına rağmen hala erişime sahip (evet!). Ya da belki birisi bir deneme teklifindeydi, ancak bu teklifin süresi doldu ve müşterinin hala bir aboneliği var (aynı zamanda evet!).

Çözüm: Yönetici paneline girip yüzlerce (belki de binlerce) aboneliği manuel olarak silmek yerine, sorunu birkaç tuşa basarak çözen en sevdiğim WordPress araçlarından biri olan WP-CLI'ye ulaşmayı seçtim.

Bu yazıda, sizi WP-CLI ile tanıştırmak (zaten yakın arkadaş olmadığınızı varsayarak), bu özel durum için yazdığım basit bir özel komutta size yol göstermek ve WP-CLI'yi kullanmak için size bazı fikirler ve kaynaklar vermek istiyorum. kendi gelişimin.

WP-CLI Nedir?

WP-CLI'yi daha önce hiç duymadıysanız, yalnız değilsiniz. Proje, birkaç yaşında olmasına rağmen, bir süre WordPress radarının altında uçuyor gibi görünüyordu. İşte resmi web sitesinden WP-CLI'nin ne olduğuna ve ne yaptığına dair kısa bir açıklama:

WP-CLI, WordPress kurulumlarını yönetmek için bir dizi komut satırı aracıdır. Bir web tarayıcısı kullanmadan eklentileri güncelleyebilir, çoklu site kurulumları ayarlayabilir ve çok daha fazlasını yapabilirsiniz.

Aşağıdaki komutlar size WP-CLI'nin kutudan çıktığı haliyle gücünü gösterir:

  • wp plugin update --all güncellenebilir tüm eklentileri günceller.
  • wp db export , veritabanınızın bir SQL dökümünü dışa aktarır.
  • wp media regenerate , ekler için küçük resimleri yeniden oluşturur (örneğin, temanızda boyutlandırmayı değiştirdikten sonra).
  • wp checksum core , WordPress çekirdek dosyalarının değiştirilmediğini doğrular.
  • wp search-replace , veritabanındaki dizeleri arar ve değiştirir.

Burada daha fazla komut keşfederseniz, her WordPress geliştiricisinin veya site bakımcısının günlük veya haftalık olarak yaptığı tekrarlayan görevler için birçok kullanılabilir komut olduğunu göreceksiniz. Bu komutlar, yıl boyunca sayısız saatlerce işaretleme, tıklama ve sayfaların yeniden yüklenmesini beklememi sağladı.

ikna oldun mu başlamaya hazır mısın? Harika!

WordPress'inizde (veya global olarak yerel makinenizde) WP-CLI'nin kurulu olması gerekir. WP-CLI'yi yerel geliştirme ortamınıza henüz yüklemediyseniz, buradaki web sitesinde kurulum talimatları bulunabilir. Varying Vagrant Vagrants (VVV2) kullanıyorsanız, WP-CLI dahildir. Birçok barındırma sağlayıcısının ayrıca platformlarında WP-CLI bulunur. Bunu ileriye doğru başarıyla yüklediğinizi varsayacağım.

Sorunu Çözmek için WP-CLI Kullanmak

Tekrarlayan görevler sorununu çözmek için, WordPress kurulumumuza özel bir WP-CLI komutu sağlamamız gerekiyor. Herhangi bir siteye işlevsellik eklemenin en kolay yollarından biri bir eklenti oluşturmaktır. Bu durumda bir eklentiyi üç ana nedenden dolayı kullanacağız:

  1. İhtiyacımız yoksa özel komutu kapatabileceğiz.
  2. Her şeyi modüler tutarken komutlarımızı ve alt komutlarımızı kolayca genişletebiliriz.
  3. Temalar ve hatta diğer WordPress kurulumları arasında işlevselliği sürdürebiliriz.

Eklentiyi Oluşturma

Eklenti oluşturmak için wp-content dizinimizde /plugins dizinimize bir dizin eklememiz gerekiyor. Bu dizine toptal-wpcli . Ardından bu dizinde iki dosya oluşturun:

  • index.php , sadece bir kod satırı olmalıdır: <?php // Silence is golden
  • plugin.php , kodumuzun gideceği yer (Bu dosyaya istediğiniz ismi verebilirsiniz.)

plugin.php dosyasını açın ve aşağıdaki kodu ekleyin:

 <?php /** * Plugin Name: TOPTAL WP-CLI Commands * Version: 0.1 * Plugin URI: https://n8finch.com/ * Description: Some rando wp-cli commands to make life easier... * Author: Nate Finch * Author URI: https://n8finch.com/ * Text Domain: toptal-wpcli * Domain Path: /languages/ * License: GPL v3 */ /** * NOTE: THIS PLUGIN FILE WILL NOT WORK IN PRODUCTION AS IS AND IS ONLY FOR DEMONSTRATION PURPOSES! * You can of course take the code and repurpose it:-). */ if ( !defined( 'WP_CLI' ) && WP_CLI ) { //Then we don't want to load the plugin return; }

Bu ilk birkaç satırın iki bölümü vardır.

İlk olarak, eklenti başlığımız var. Bu bilgi WordPress Eklentileri yönetici sayfasına çekilir ve eklentimizi kaydetmemize ve etkinleştirmemize izin verir. Yalnızca eklenti adı gereklidir, ancak geri kalanını bu kodu kullanmak isteyebilecek herkes (ve gelecekteki benliklerimiz!) için eklemeliyiz.

İkinci olarak, WP-CLI'nin tanımlı olup olmadığını kontrol etmek istiyoruz. Yani, WP-CLI sabitinin mevcut olup olmadığını kontrol ediyoruz. Değilse, kefaletle çıkmak ve eklentiyi çalıştırmamak istiyoruz. Varsa, kodumuzun geri kalanını çalıştırabiliriz.

Bu iki bölüm arasına, bazı fonksiyonlar gerçek fonksiyonlar için yer tutucu olduğundan, bu kodun üretimde “olduğu gibi” kullanılmaması gerektiğine dair bir not ekledim. Bu yer tutucu işlevleri gerçek, etkin işlevlerle değiştirirseniz, bu notu silmekten çekinmeyin.

Özel Komutu Ekleme

Ardından, aşağıdaki kodu eklemek istiyoruz:

 class TOPTAL_WP_CLI_COMMANDS extends WP_CLI_Command { function remove_user() { echo "\n\n hello world \n\n"; } } WP_CLI::add_command( 'toptal', 'TOPTAL_WP_CLI_COMMANDS' );

Bu kod bloğu bizim için iki şey yapar:

  1. Argümanları iletebileceğimiz TOPTAL_WP_CLI_COMMANDS sınıfını tanımlar.
  2. toptal komutunu sınıfa atar, böylece onu komut satırından çalıştırabiliriz.

Şimdi wp toptal remove_user çalıştırırsak şunu görürüz:

 $ wp toptal hello hello world

Bu, toptal kayıtlı olduğu ve remove_user alt komutumuzun çalıştığı anlamına gelir.

Değişkenleri Ayarlama

Kullanıcıları toplu olarak kaldırdığımız için aşağıdaki değişkenleri ayarlamak istiyoruz:

 // Keep a tally of warnings and loops $total_warnings = 0; $total_users_removed = 0; // If it's a dry run, add this to the end of the success message $dry_suffix = ''; // Keep a list of emails for users we may want to double check $emails_not_existing = array(); $emails_without_level = array(); // Get the args $dry_run = $assoc_args['dry-run']; $level = $assoc_args['level']; $emails = explode( ',', $assoc_args['email'] );

Değişkenlerin her birinin amacı aşağıdaki gibidir:

  • total_warnings : E-posta mevcut değilse veya e-posta, kaldırdığımız üyelik düzeyiyle ilişkili değilse bir uyarı göndeririz.
  • $total_users_removed : İşlem sırasında kaldırılan kullanıcıların sayısını hesaplamak istiyoruz (aşağıdaki uyarıya bakın).
  • $dry_suffix : Bu bir kuru çalışmaysa, son başarı bildirimine ifade eklemek istiyoruz.
  • $emails_not_existing : Var olmayan e-postaların bir listesini saklar.
  • $emails_without_level : Belirtilen seviyeye sahip olmayan e-postaların listesini saklar.
  • $dry_run : Komut dosyasının bir kuru çalıştırma (doğru) yapıp yapmadığını (yanlış) saklayan bir boolean.
  • $level : Kontrol edilecek ve muhtemelen kaldırılacak seviyeyi temsil eden bir tam sayı.
  • $email : Verilen seviyeye göre kontrol edilecek bir dizi e-posta. Bu dizide dolaşacağız

Değişkenlerimiz ayarlandığında, işlevi gerçekten çalıştırmaya hazırız. Gerçek WordPress tarzında bir döngü çalıştıracağız.

Fonksiyonun Kendisini Yazma

$emails dizimizdeki tüm e-postalar arasında geçiş yapmak için bir foreach döngüsü oluşturarak başlıyoruz:

 // Loop through emails foreach ( $emails as $email ) { // code coming soon } // end foreach

Ardından, koşullu bir kontrol ekliyoruz:

 // Loop through emails foreach ( $emails as $email ) { //Get User ID $user_id = email_exists($email); if( !$user_id ) { WP_CLI::warning( "The user {$email} does not seem to exist." ); array_push( $emails_not_existing, $email ); $total_warnings++; continue; } } // end foreach

Bu kontrol, kontrol ettiğimiz e-posta ile kayıtlı bir kullanıcımızın olmasını sağlar. Bu e-postaya sahip bir kullanıcı olup olmadığını kontrol etmek için email_exists() işlevini kullanır. Bu e-postaya sahip bir kullanıcı bulamazsa, terminal ekranımızda e-postanın bulunamadığını bilmemiz için bir uyarı verir:

 $ wp toptal remove_user [email protected] --dry-run Warning: The user [email protected] does not seem to exist.

E-posta daha sonra daha sonra görüntülenmek üzere $emails_not_existing dizisinde saklanır. Ardından toplam uyarıyı birer birer artırırız ve döngü boyunca bir sonraki e-postaya devam ederiz.

E-posta varsa, kullanıcının düzeye erişimi olup olmadığını kontrol etmek için $user_id ve $level değişkenlerini kullanırız. Elde edilen boole değerini $has_level değişkeninde saklarız:

 // Loop through emails foreach ( $emails as $email ) { //Get User ID $user_id = email_exists($email); if( !$user_id ) { WP_CLI::warning( "The user {$email} does not seem to exist." ); array_push( $emails_not_existing, $email ); $total_warnings++; continue; } // Check membership level. This is a made up function, but you could write one or your membership plugin probably has one. $has_level = function_to_check_membership_level( $level, $user_id ); } // end foreach

Bu örnekteki çoğu işlev gibi, bu function_to_check_membership_level() işlevi de üretilmiştir, ancak çoğu üyelik eklentisi size bu bilgiyi almak için yardımcı işlevlere sahip olmalıdır.

Şimdi ana eyleme geçeceğiz: seviyeyi kullanıcıdan kaldırmak. Şuna benzeyen bir if/else yapısı kullanacağız:

 foreach ( $emails as $email ) { // Previous code here... // Check membership level. This is a made up function, but you could write one or your membership plugin probably has one. $has_level = function_to_check_membership_level( $level, $user_id ); if ( $has_level ) { if ( !$dry_run ) { // Deactivate membership level. This is a made up function, but you could write one or your membership plugin probably has one. function_to_deactivate_membership_level( $level, $user_id, 'inactive' ); } WP_CLI::success( "Membership canceled for {$email}, Level {$level} removed" . PHP_EOL ); $total_users_removed++; } else { WP_CLI::warning( "The user {$email} does not have Level = {$level} membership." ); array_push( $emails_without_level, $email ); $total_warnings++; } // We could echo something here to show that things are processing... } // end foreach

$has_level değeri, kullanıcının üyelik seviyesine erişimi olduğu anlamına gelen “truthy” ise, bu seviyeyi kaldırmak için bir fonksiyon çalıştırmak istiyoruz. Bu örnekte, bu eylemi gerçekleştirmek için function_to_deactivate_membership_level() işlevini kullanacağız.

Ancak, seviyeyi kullanıcıdan gerçekten kaldırmadan önce, bunun gerçekten bir dry-run olup olmadığını görmek için bu işlevi koşullu bir kontrole dahil etmek istiyoruz. Eğer öyleyse, hiçbir şeyi kaldırmak istemiyoruz, sadece yaptığımızı rapor ediyoruz. dry-run değilse, o zaman devam edip seviyeyi kullanıcıdan kaldıracağız, başarı mesajımızı terminale kaydedeceğiz ve e-postalar arasında döngüye devam edeceğiz.

Öte yandan, $has_level değeri "falsey" ise, kullanıcının üyelik seviyesine erişimi olmadığı anlamına geliyorsa, terminale bir uyarı kaydetmek, e-postayı $emails_without_level dizisine göndermek ve devam etmek istiyoruz. e-postalar arasında döngü.

Bitirme ve Raporlama

Döngü bittiğinde, sonuçlarımızı konsola kaydetmek istiyoruz. Bu bir kuru çalışmaysa, konsola fazladan bir mesaj kaydetmek istiyoruz:

 if ( $dry_run ) { $dry_suffix = 'BUT, nothing really changed because this was a dry run:-).'; }

Bu $dry-suffix , daha sonra günlüğe kaydedeceğimiz uyarılara ve başarı bildirimlerine eklenecektir.

Bitirirken, sonuçlarımızı bir başarı mesajı ve uyarılarımızı uyarı mesajları olarak kaydetmek istiyoruz. Bunu şöyle yapacağız:

 WP_CLI::success( "{$total_users_removed} User/s been removed, with {$total_warnings} warnings. {$dry_suffix}" ); if ( $total_warnings ) { $emails_not_existing = implode(',', $emails_not_existing); $emails_without_level = implode(',', $emails_without_level); WP_CLI::warning( "These are the emails to double check and make sure things are on the up and up:" . PHP_EOL . "Non-existent emails: " . $emails_not_existing . PHP_EOL . "Emails without the associated level: " . $emails_without_level . PHP_EOL ); }

WP_CLI::success ve WP_CLI::warning yardımcı yöntemlerini kullandığımızı unutmayın. Bunlar, konsola bilgi kaydetmek için WP-CLI tarafından sağlanır. $total_users_removed , $total_warnings ve $dry_suffix değişkenlerimiz dahil burada yaptığımız gibi dizeleri kolayca günlüğe kaydedebilirsiniz.

Son olarak, betiğin çalışma zamanı boyunca herhangi bir uyarı aldıysak, bu bilgiyi konsola yazdırmak istiyoruz. Koşullu bir kontrol yaptıktan sonra, $emails_not_existing ve $emails_without_level dizi değişkenlerini string değişkenlerine dönüştürüyoruz. Bunu, WP_CLI::warning helper yöntemini kullanarak konsola yazdırabilmemiz için yapıyoruz.

Açıklama Ekleme

Hepimiz yorumların başkalarına ve gelecekteki kendimize, haftalar, aylar ve hatta yıllar sonra kodumuza geri dönersek faydalı olduğunu biliyoruz. WP-CLI, komutumuza açıklama eklememize izin veren kısa açıklamalar (shortdesc) ve uzun açıklamalar (longdesc) içeren bir arayüz sağlar. TOPTAL_WP_CLI_COMMANDS sınıfı tanımlandıktan sonra komutumuzun başına koyacağız:

 /** * Remove a membership level from a user * * ## OPTIONS * --level=<number> * : Membership level to check for and remove * * --email=<email> * : Email of user to check against * * [--dry-run] * : Run the entire search/replace operation and show report, but don't save changes to the database. * * ## EXAMPLES * * wp toptal remove_user --level=5 [email protected],[email protected], [email protected] --dry-run * * @when after_wp_load */

Longdesc'de, özel komutumuzun ne almasını beklediğimizi tanımlarız. Shortdesc ve longdesc'in sözdizimi Markdown Extra'dır. ## OPTIONS bölümünün altında, almayı beklediğimiz argümanları tanımlarız. Bir argüman gerekliyse onu < > içine, isteğe bağlıysa [ ] içine sararız.

Bu seçenekler, komut çalıştırıldığında doğrulanır; örneğin, gerekli e-posta parametresini dışarıda bırakırsak aşağıdaki hatayı alırız:

 $ wp toptal remove_user --level=5 --dry-run Error: Parameter errors: missing --email parameter (Email of user to check against)

## EXAMPLES bölümü, çağrıldığında komutun nasıl görünebileceğinin bir örneğini içerir.

Özel komutumuz şimdi tamamlandı. Son özü burada görebilirsiniz.

Bir Uyarı ve İyileştirme Odası

Kodun nasıl geliştirilebileceğini, genişletilebileceğini ve yeniden düzenlenebileceğini görmek için burada yaptığımız çalışmaları gözden geçirmek önemlidir. Bu komut dosyası için birçok iyileştirme alanı vardır. İşte yapılabilecek iyileştirmeler hakkında bazı gözlemler.

Bazen, bu betiğin günlüğe kaydettiği tüm kullanıcıları "kaldırıldı" olarak kaldırmayacağını fark ettim. Bunun nedeni büyük olasılıkla komut dosyasının sorguların yürütebileceğinden daha hızlı çalışmasıdır. Deneyiminiz, komut dosyasının çalıştırıldığı ortama ve kuruluma bağlı olarak değişebilir. Bunu aşmanın hızlı yolu, aynı girdilerle tekrar tekrar çalıştırmaktır; sonunda sıfırlanacak ve hiçbir kullanıcının kaldırılmadığını bildirecektir.

Komut dosyası, kullanıcıyı gerçekten kaldırılmış olarak kaydetmeden önce bir kullanıcının kaldırıldığını beklemek ve doğrulamak için geliştirilebilir. Bu, betiğin yürütülmesini yavaşlatır, ancak daha doğru olur ve onu yalnızca bir kez çalıştırmanız gerekir.

Benzer şekilde, bunun gibi hatalar bulunursa, komut dosyası, bir düzeyin kullanıcıdan kaldırılmadığını bildirmek için hatalar verebilir.

Komut dosyasını geliştirmek için başka bir alan, aynı anda birden çok düzeyin bir e-posta adresinden kaldırılmasına izin vermektir. Komut dosyası, kaldırılacak bir veya daha fazla düzey ve bir veya daha fazla e-posta olup olmadığını otomatik olarak algılayabilir. Bana seviye bazında CSV dosyaları verildi, bu yüzden her seferinde sadece bir seviye çalıştırmam gerekiyordu.

Ayrıca, şu anda sahip olduğumuz daha ayrıntılı koşullu kontroller yerine üçlü operatörleri kullanmak için bazı kodları yeniden düzenleyebiliriz. Bunu göstermek için okumayı kolaylaştırmayı seçtim, ancak kodu kendiniz yapmaktan çekinmeyin.

Son adımda, e-postaları son adımda konsola yazdırmak yerine, bunları otomatik olarak bir CSV veya düz metin dosyasına da aktarabiliriz.

Son olarak, $level değişkeni için bir tamsayı veya $emails değişkeninde bir e-posta veya virgülle ayrılmış e-posta listesi aldığımızdan emin olmak için herhangi bir kontrol yoktur. Şu anda, birisi tamsayılar yerine dizeler veya e-postalar yerine kullanıcı oturum açma adları ekleseydi, komut dosyası çalışmaz (ve hata vermez). Tamsayılar ve e-postalar için kontroller eklenebilir.

Daha Fazla Otomasyon ve Daha Fazla Okuma İçin Fikirler

Gördüğünüz gibi, bu özel kullanım durumunda bile WP-CLI, işinizi hızlı ve verimli bir şekilde yapmanıza yardımcı olacak kadar esnek ve güçlüdür. Kendi kendinize “Günlük ve haftalık geliştirme akışımda WP-CLI’yi uygulamaya nasıl başlayabilirim?” diye merak ediyor olabilirsiniz.

WP-CLI'yi kullanmanın birkaç yolu vardır. İşte favorilerimden bazıları:

  • Yönetici paneline gitmek zorunda kalmadan temaları, eklentileri ve WP çekirdeğini güncelleyin.
  • Bir SQL sorgusunu test etmek istersem, veritabanlarını yedekleme için dışa aktarın veya hızlı bir SQL dökümü gerçekleştirin.
  • WordPress sitelerini taşıyın.
  • Sahte veriler veya özel eklenti paketi kurulumlarıyla yeni WordPress siteleri kurun.
  • Güvenliğinin ihlal edilmediğinden emin olmak için çekirdek dosyalarda sağlama toplamları çalıştırın. (Aslında bunu WP deposundaki temalara ve eklentilere genişletmek için devam eden bir proje var.)
  • Site ana bilgisayarlarını kontrol etmek, güncellemek ve bakımını yapmak için kendi komut dosyanızı yazın (ki burada hakkında yazdım).

WP-CLI ile olanaklar neredeyse sınırsızdır. İşte ilerlemenizi sağlayacak bazı kaynaklar:

  • Ana WP-CLI sitesi: http://wp-cli.org
  • WP-CLI Komutları: https://developer.wordpress.org/cli/commands/
  • Resmi WP-CLI Blogu: https://make.wordpress.org/cli/
  • WP-CLI El Kitabı: https://make.wordpress.org/cli/handbook/
  • WooCommerce'e mi? WC-CLI'ye göz atın: https://github.com/woocommerce/woocommerce/wiki/WC-CLI-Overview#woocommerce-commands
  • Projenin yürütücüsü Daniel Bachhuber ile Podcast Röportajı: https://howibuilt.it/episode-28-daniel-bachhuber-wp-cli/