テーマ、プラグイン、およびWPコアを更新するためにWordPress管理エリアにアクセスしたことがありますか?もちろんあります。 「このCSVファイルのすべてのユーザーを作成/更新/削除できますか?」と尋ねられましたか?あなたもそれに遭遇したと確信しています。サイトの移行を試みて、その仕事をするためにアクセスできるプラグインまたはサードパーティのツールがあればいいのにと思いましたか?私は持っていることを知っています!
これらのタスクなどを支援するために利用できる非常に強力なツールがあります。それについてお話しする前に、簡単な逸話を設定したいと思います。
問題: 最近のプロジェクトでは、定期的に繰り返す必要のあるいくつかのプログラムタスクがありました。特に1つのタスクには、メンバーシップレベルの購入またはサブスクリプションの証拠に基づいてユーザーレベルのアクセス許可を更新することが含まれていました。会社が特定のメンバーシップレベルに対するユーザーからの支払いを見つけることができなかった場合、彼らはメンバーシップレベルをユーザーから削除することを望んでいました。なぜこれが必要だったのですか?おそらく、メンバーがサブスクリプションを停止したが、イベントが発生しなかったため、メンバーは料金を支払っていなくてもアクセスできます(そうです!)。または、誰かが試用版のオファーを行っていたが、そのオファーの有効期限が切れており、クライアントはまだサブスクリプションを持っています(これもイケてる!)。
ソリューション: 管理パネルに移動して数百(おそらく数千)のサブスクリプションを手動で削除する代わりに、お気に入りのWordPressツールの1つであるWP-CLIを選択しました。これにより、数回のキーストロークで問題が修正されました。
この投稿では、WP-CLIを紹介し(まだ親しい友人ではないと仮定して)、この特定の状況のために作成した簡単なカスタムコマンドを紹介し、でWP-CLIを使用するためのアイデアとリソースをいくつか紹介します。あなた自身の開発。
これまでWP-CLIについて聞いたことがない場合は、あなただけではありません。このプロジェクトは数年前のものでしたが、しばらくの間WordPressのレーダーの下で飛んでいたようです。 WP-CLIとは何か、公式Webサイトからの機能について簡単に説明します。
WP-CLIは、WordPressのインストールを管理するためのコマンドラインツールのセットです。 Webブラウザーを使用せずに、プラグインの更新、マルチサイトインストールのセットアップなどを行うことができます。
次のコマンドは、すぐに使用できるWP-CLIの機能を示しています。
wp plugin update --all
すべての更新可能なプラグインを更新します。wp db export
データベースのSQLダンプをエクスポートします。wp media regenerate
添付ファイルのサムネイルを再生成します(たとえば、テーマのサイズを変更した後)。wp checksum core
WordPressコアファイルが改ざんされていないことを確認します。wp search-replace
データベース内の文字列を検索して置き換えます。より多くのコマンドを探索する場合 ここに 、繰り返しタスクに使用できるコマンドがたくさんあることがわかります。 WordPress開発者 またはサイトメンテナは毎日または毎週行います。これらのコマンドにより、1年を通して、ページの再読み込みをポイント、クリック、および待機する時間を数え切れないほど節約できました。
あなたは確信していますか?始める準備はできましたか?すごい!
WordPressと一緒に(またはローカルマシンにグローバルに)WP-CLIをインストールする必要があります。ローカル開発環境にWP-CLIをまだインストールしていない場合、インストール手順はWebサイトにあります。 ここに 。使用している場合 さまざまなVagrantVagrants (VVV2)、WP-CLIが含まれています。多くのホスティングプロバイダーは、プラットフォームにWP-CLIも含まれています。これが正常にインストールされていることを前提としています。
反復的なタスクの問題を解決するには、WordPressのインストールでカスタムWP-CLIコマンドを使用できるようにする必要があります。サイトに機能を追加する最も簡単な方法の1つは、プラグインを作成することです。このインスタンスでは、次の3つの主な理由でプラグインを使用します。
プラグインを作成するには、/plugins
にディレクトリを追加する必要があります。 wp-content
のディレクトリディレクトリ。このディレクトリをtoptal-wpcli
と呼ぶことができます。次に、そのディレクトリに2つのファイルを作成します。
index.php
、コードは1行のみにする必要があります:
plugin.php
、これがコードの移動先です(このファイルには任意の名前を付けることができます)。plugin.php
を開きますファイルを作成し、次のコードを追加します。
これらの最初の数行には2つの部分があります。
まず、プラグインヘッダーがあります。この情報はWordPressプラグインの管理ページに取り込まれ、プラグインを登録してアクティブ化することができます。プラグイン名のみが必要ですが、このコードを使用する可能性のある人(および将来の自分自身)のために残りを含める必要があります。
第二に、 WP-CLIが定義されていることを確認してください 。つまり、WP-CLI定数が存在するかどうかを確認しています。そうでない場合は、プラグインを実行せずに保釈したいと思います。存在する場合は、残りのコードを実行することは明らかです。
これらの2つのセクションの間に、一部の関数は実際の関数のプレースホルダーであるため、このコードを本番環境で「そのまま」使用してはならないことに注意してください。これらのプレースホルダー関数を実際のアクティブな関数に変更する場合は、このメモを自由に削除してください。
カスタムコマンドの追加
次に、次のコードを含めます。
class TOPTAL_WP_CLI_COMMANDS extends WP_CLI_Command { function remove_user() { echo '
hello world
'; } } WP_CLI::add_command( 'toptal', 'TOPTAL_WP_CLI_COMMANDS' );
このコードブロックは、2つのことを行います。
- クラス
TOPTAL_WP_CLI_COMMANDS
を定義し、引数を渡すことができます。 - コマンド
toptal
を割り当てますクラスに追加するので、コマンドラインから実行できます。
ここで、wp toptal remove_user
を実行すると、次のようになります。
$ wp toptal hello hello world
これは私たちのコマンドを意味しますtoptal
が登録され、サブコマンドremove_user
仕事中。
変数の設定
ユーザーを削除する一括処理を行っているため、次の変数を設定します。
// 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'] );
各変数の目的は次のとおりです。
total_warnings
:メールが存在しない場合、またはメールが削除するメンバーシップレベルに関連付けられていない場合は、警告を集計します。 $total_users_removed
:プロセスで削除されたユーザーの数を集計したいと思います(以下の警告を参照)。 $dry_suffix
:これがドライランの場合、最終的な成功通知に文言を追加します。 $emails_not_existing
:存在しない電子メールのリストを格納します。 $emails_without_level
:指定されたレベルを持たない電子メールのリストを格納します。 $dry_run
:スクリプトがドライランを実行しているか(true)、実行していないか(false)を格納するブール値。 $level
:チェックして削除する可能性のあるレベルを表す整数。 $email
:指定されたレベルに対してチェックする一連の電子メール。この配列をループします
変数を設定すると、実際に関数を実行する準備が整います。本当のWordPressのやり方で、ループを実行します。
関数自体を書く
foreach
を作成することから始めます$emails
内のすべてのメールを循環するループアレイ:
// Loop through emails foreach ( $emails as $email ) { // code coming soon } // end foreach
次に、条件付きチェックを追加します。
グラフィックデザインを批評する方法
// 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
このチェックにより、チェックしている電子メールに登録ユーザーがいることが確認されます。 email_exists()
を使用しますそのメールを持っているユーザーがいるかどうかをチェックする機能。その電子メールを持つユーザーが見つからない場合は、警告がスローされ、ターミナル画面で電子メールが見つからなかったことがわかります。
$ wp toptal remove_user [email protected] --dry-run Warning: The user [email protected] does not seem to exist.
その後、メールは$emails_not_existing
に保存されます後で表示するための配列。次に、警告の合計を1つ増やし、ループを続けて次の電子メールに進みます。
メールが存在する場合は、$user_id
を使用しますおよび$level
ユーザーがレベルにアクセスできるかどうかを確認する変数。結果のブール値を$has_level
に格納します変数:
// 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
この例のほとんどの関数と同様に、これはfunction_to_check_membership_level()
関数は作成されていますが、ほとんどのメンバーシッププラグインには、この情報を取得するためのヘルパー関数が必要です。
次に、メインアクションであるユーザーからレベルを削除します。 if/else
を使用しますこのような構造:
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
の値がは「真実」です。つまり、ユーザーはメンバーシップレベルにアクセスできます。このレベルを削除する関数を実行します。この例では、function_to_deactivate_membership_level()
を使用しますこのアクションを実行する関数。
ただし、実際にユーザーからレベルを削除する前に、その関数を条件付きチェックで囲んで、これが実際にdry-run
であるかどうかを確認します。そうである場合は、何も削除せず、削除したことを報告するだけです。 dry-run
でない場合は、先に進んでユーザーからレベルを削除し、成功メッセージを端末に記録して、電子メールをループし続けます。
一方、$has_level
の値がは「falsey」です。これは、ユーザーがメンバーシップレベルにアクセスできないことを意味します。端末に警告を記録し、電子メールを$emails_without_level
にプッシュします。配列し、電子メールをループし続けます。
仕上げとレポート
ループが終了したら、結果をコンソールに記録します。これがドライランの場合は、コンソールに追加のメッセージを記録します。
if ( $dry_run ) { $dry_suffix = 'BUT, nothing really changed because this was a dry run:-).'; }
これ$dry-suffix
次にログに記録する警告と成功通知に追加されます。
最後に、結果を成功メッセージとしてログに記録し、警告を警告メッセージとしてログに記録します。私たちはこのようにします:
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
を使用していることに注意してくださいおよびWP_CLI::warning
ヘルパーメソッド。これらは、コンソールに情報を記録するためにWP-CLIによって提供されます。ここでは、$total_users_removed
、$total_warnings
、$dry_suffix
などの文字列を簡単にログに記録できます。変数。
最後に、スクリプトの実行中に警告が発生した場合は、その情報をコンソールに出力します。条件付きチェックを実行した後、$emails_not_existing
を変換しますおよび$emails_without_level
配列変数を文字列変数に変換します。これを行うのは、WP_CLI::warning
を使用してコンソールに印刷できるようにするためです。ヘルパーメソッド。
説明の追加
コメントが他の人や、数週間、数か月、さらには数年後にコードに戻る将来の自分に役立つことは誰もが知っています。 WP-CLIは、短い説明(shortdesc)と長い説明(longdesc)のインターフェースを提供し、コマンドに注釈を付けることができます。コマンドの先頭、TOPTAL_WP_CLI_COMMANDS
の後に配置しますクラスが定義されています:
/** * Remove a membership level from a user * * ## OPTIONS * --level= * : Membership level to check for and remove * * --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では、カスタムコマンドが受け取るものを定義します。 shortdescとlongdescの構文は次のとおりです。 マークダウンエクストラ 。 ## OPTIONS
の下セクションでは、受け取ると予想される引数を定義します。引数が必要な場合はそれをラップし、オプションの場合は[ ]
でラップします。
これらのオプションは、コマンドの実行時に検証されます。たとえば、必要な電子メールパラメータを省略すると、次のエラーが発生します。
$ wp toptal remove_user --level=5 --dry-run Error: Parameter errors: missing --email parameter (Email of user to check against)
## EXAMPLES
セクションには、呼び出されたときにコマンドがどのように見えるかの例が含まれています。
これでカスタムコマンドが完成しました。あなたは最終的な要点を見ることができます ここに 。
警告と改善の余地
ここで行った作業を確認して、コードをどのように改善、拡張、リファクタリングできるかを確認することが重要です。このスクリプトには多くの改善点があります。これは、行うことができる改善についてのいくつかの観察です。
ときどき、このスクリプトが「削除済み」としてログに記録するすべてのユーザーを削除しないことがわかりました。これは、クエリの実行速度よりも速くスクリプトが実行されていることが原因である可能性があります。スクリプトが実行される環境とセットアップによって、エクスペリエンスが異なる場合があります。これを回避する簡単な方法は、同じ入力で繰り返し実行することです。最終的にはゼロになり、削除されたユーザーがいないことが報告されます。
スクリプトは、ユーザーが実際に削除されたとログに記録する前に、ユーザーが削除されたことを待機して検証するように改善できます。これにより、スクリプトの実行が遅くなりますが、より正確になり、実行する必要があるのは1回だけです。
同様に、このようなエラーが見つかった場合、スクリプトはエラーをスローして、レベルがユーザーから削除されていないことを警告する可能性があります。
スクリプトを改善するもう1つの領域は、一度に複数のレベルを1つの電子メールアドレスから削除できるようにすることです。スクリプトは、削除するレベルと電子メールが1つ以上あるかどうかを自動検出できます。レベルごとにCSVファイルが提供されたので、一度に1つのレベルを実行するだけで済みました。
また、コードの一部をリファクタリングして、現在のより冗長な条件チェックの代わりに3項演算子を使用することもできます。デモンストレーションのためにこれを読みやすくすることを選択しましたが、コードを自由に独自のものにしてください。
最終ステップでは、最終ステップでコンソールに電子メールを印刷する代わりに、CSVまたはプレーンテキストファイルに自動的にエクスポートすることもできます。
最後に、$level
の整数を取得していることを確認するためのチェックはありません。 $emails
内の変数またはEメールまたはEメールのコンマ区切りリスト変数。現在、誰かが整数の代わりに文字列を含めたり、電子メールの代わりにユーザーログイン名を含めたりすると、スクリプトは機能しません(エラーはスローされません)。整数と電子メールのチェックを追加できます。
@media screen and(max-width 480px)
さらなる自動化とさらなる読書のためのアイデア
ご覧のとおり、この特定のユースケースでも、WP-CLIは非常に柔軟で強力であるため、作業を迅速かつ効率的に行うことができます。 「毎日および毎週の開発フローでWP-CLIの実装を開始するにはどうすればよいですか?」と疑問に思われるかもしれません。
WP-CLIを使用する方法はいくつかあります。これが私のお気に入りのいくつかです:
- 管理パネルに移動せずに、テーマ、プラグイン、およびWPコアを更新します。
- SQLクエリをテストする場合は、バックアップ用にデータベースをエクスポートするか、クイックSQLダンプを実行します。
- WordPressサイトを移行します。
- ダミーデータまたはカスタムプラグインスイートのセットアップを使用して、新しいWordPressサイトをインストールします。
- コアファイルに対してチェックサムを実行して、それらが危険にさらされていないことを確認します。 (実際にあります 進行中のプロジェクト これをWPリポジトリのテーマとプラグインに拡張します。)
- サイトホストをチェック、更新、および保守するための独自のスクリプトを作成します(これについては私が書きました) ここに )。
WP-CLIの可能性はほぼ無限です。前進し続けるためのリソースは次のとおりです。
- メインのWP-CLIサイト: http://wp-cli.org
- WP-CLIコマンド: https://developer.wordpress.org/cli/commands/
- 公式WP-CLIブログ: https://make.wordpress.org/cli/
- WP-CLIハンドブック: https://make.wordpress.org/cli/handbook/
- WooCommerceに? WC-CLIをチェックアウトします。 https://github.com/woocommerce/woocommerce/wiki/WC-CLI-Overview#woocommerce-commands
- プロジェクトのメンテナであるDanielBachhuberへのポッドキャストインタビュー: https://howibuilt.it/episode-28-daniel-bachhuber-wp-cli/
基本を理解する
いつWP-CLIを使用する必要がありますか?
WP-CLIを使用して、wp-adminまたはコードで実行する反復タスクを自動化する必要があります。たとえば、バックアップ、移行、新しいWordPressインストールのセットアップ、メンテナンスのためのサイトでのチェックサムと更新の実行、新しいユーザーのバッチ作成、等
WP-CLIとは何ですか?
WP-CLIは、プラグイン、テーマ、またはコアを更新できるようにするWordPressのコマンドラインインターフェイスです。データベースのバックアップまたは移行。カスタムスクリプトを作成します。さらに、すべてWebブラウザを使用せずに。