はなゐろぐ

wp-cliでデータベース内を検索・置換する

2020.04.21 13:04

カスタムフィールドを含めた記事内の全てのURLを絶対パスからルート相対パスに置換することがありまして。記事数が多かったので手動は避けたいと思い、Search Regexを試しました。しかし複雑なサブフィールドまでは検索できなかったのでさらに調べたところ、wp-cliで置換できるとのことで試してみました。

wp search-replace

wp search-replace <置換前> <置換後>でデータベース内のテキストを検索・置換できます。今回は使っていませんが、正規表現でも検索可能なようです。

※データベースを直接変更するので、必ず事前にバックアップを取っておきましょう。

作業の流れ

まずは—dry-runオプションをつけて、実際には置換せず検索だけかけます。

$ wp search-replace '{置換したいURL}' '/' --dry-run
+------------------+-----------------------+--------------+------+
| Table            | Column                | Replacements | Type |
+------------------+-----------------------+--------------+------+
| wp_commentmeta   | meta_key              | 0            | SQL  |
| wp_commentmeta   | meta_value            | 0            | SQL  |
| wp_comments      | comment_author        | 0            | SQL  |
| wp_comments      | comment_author_email  | 0            | SQL  |
| wp_comments      | comment_author_url    | 0            | SQL  |
| wp_comments      | comment_author_IP     | 0            | SQL  |
| wp_comments      | comment_content       | 0            | SQL  |
| wp_comments      | comment_approved      | 0            | SQL  |
| wp_comments      | comment_agent         | 0            | SQL  |
| wp_comments      | comment_type          | 0            | SQL  |
| wp_links         | link_url              | 0            | SQL  |
| wp_links         | link_name             | 0            | SQL  |
| wp_links         | link_image            | 0            | SQL  |
| wp_links         | link_target           | 0            | SQL  |
| wp_links         | link_description      | 0            | SQL  |
| wp_links         | link_visible          | 0            | SQL  |
| wp_links         | link_rel              | 0            | SQL  |
| wp_links         | link_notes            | 0            | SQL  |
| wp_links         | link_rss              | 0            | SQL  |
| wp_options       | option_name           | 0            | SQL  |
| wp_options       | option_value          | 1            | PHP  |
| wp_options       | autoload              | 0            | SQL  |
| wp_postmeta      | meta_key              | 0            | SQL  |
| wp_postmeta      | meta_value            | 956          | PHP  |
| wp_posts         | post_content          | 437          | SQL  |
| wp_posts         | post_title            | 0            | SQL  |
| wp_posts         | post_excerpt          | 0            | SQL  |
| wp_posts         | post_status           | 0            | SQL  |
| wp_posts         | comment_status        | 0            | SQL  |
| wp_posts         | ping_status           | 0            | SQL  |
| wp_posts         | post_password         | 0            | SQL  |
| wp_posts         | post_name             | 0            | SQL  |
| wp_posts         | to_ping               | 0            | SQL  |
| wp_posts         | pinged                | 0            | SQL  |
| wp_posts         | post_content_filtered | 0            | SQL  |
| wp_posts         | guid                  | 5361         | SQL  |
| wp_posts         | post_type             | 0            | SQL  |
| wp_posts         | post_mime_type        | 0            | SQL  |
| wp_term_taxonomy | taxonomy              | 0            | SQL  |
| wp_term_taxonomy | description           | 0            | SQL  |
| wp_termmeta      | meta_key              | 0            | SQL  |
| wp_termmeta      | meta_value            | 0            | SQL  |
| wp_terms         | name                  | 0            | SQL  |
| wp_terms         | slug                  | 0            | SQL  |
| wp_usermeta      | meta_key              | 0            | SQL  |
| wp_usermeta      | meta_value            | 0            | PHP  |
| wp_users         | user_login            | 0            | SQL  |
| wp_users         | user_nicename         | 0            | SQL  |
| wp_users         | user_email            | 0            | SQL  |
| wp_users         | user_url              | 0            | SQL  |
| wp_users         | user_activation_key   | 0            | SQL  |
| wp_users         | display_name          | 0            | SQL  |
+------------------+-----------------------+--------------+------+

wp_optionsの中にあるサイトURLなどの設定を含めないよう、今回はwp_posts(投稿)とwp_postmeta(カスタムフィールド)のテーブルに絞ります。

$ wp search-replace ‘{置換したいURL}’ '/' wp_posts wp_postmeta --dry-run
+-------------+-----------------------+--------------+------+
| Table       | Column                | Replacements | Type |
+-------------+-----------------------+--------------+------+
| wp_postmeta | meta_key              | 0            | SQL  |
| wp_postmeta | meta_value            | 956          | PHP  |
| wp_posts    | post_content          | 437          | SQL  |
| wp_posts    | post_title            | 0            | SQL  |
| wp_posts    | post_excerpt          | 0            | SQL  |
| wp_posts    | post_status           | 0            | SQL  |
| wp_posts    | comment_status        | 0            | SQL  |
| wp_posts    | ping_status           | 0            | SQL  |
| wp_posts    | post_password         | 0            | SQL  |
| wp_posts    | post_name             | 0            | SQL  |
| wp_posts    | to_ping               | 0            | SQL  |
| wp_posts    | pinged                | 0            | SQL  |
| wp_posts    | post_content_filtered | 0            | SQL  |
| wp_posts    | guid                  | 5361         | SQL  |
| wp_posts    | post_type             | 0            | SQL  |
| wp_posts    | post_mime_type        | 0            | SQL  |
+-------------+-----------------------+--------------+------+

問題なさそうなので、—dry-runオプションを外して置換を実行します。

$ wp search-replace ‘{置換したいURL}’ '/' wp_posts wp_postmeta

管理画面にログインして、該当箇所が置換されていることと、問題なく動作することを確認できたら完了です。

ヘテムルでWordmoveをつかう

2020.04.15 15:04

ヘテムルでWordmoveを利用するには下記の条件が必要です。

  • SSH接続を利用できるように手続きしてあること
  • メインFTPアカウントが利用できること(サブアカウントだとSSHは利用できません)

これらの条件が揃っていることを前提として進めていきます。

SSH接続できるようにする

鍵のファイル名はid_rsa_hetemlとして話を進めます。余談ですがヘテムルのマニュアルにはFTPアカウントのパスワードを入力するよう書かれていましたがSSHのパスワードじゃないとログインできませんでした。謎…。

最初に、~/.ssh/configに設定を追加。

+ Host heteml
+   HostName        {ホスト名}
+   User            {ユーザ名}
+   Port            2222
+   IdentityFile    ~/.ssh/id_rsa_heteml
+   IdentitiesOnly  yes
+   PreferredAuthentications password

次に、公開鍵を作成してヘテムルにコピーし、リネームして権限を変更します。

$ cd ~/.ssh
$ ssh-keygen -t rsa
$ scp ~/.ssh/id_rsa_heteml.pub heteml:~/
$ ssh heteml
# ここからサーバ内
$ mkdir .ssh
$ mv id_rsa_heteml.pub .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
$ exit

最後に、~/.ssh/configから1行削除します。

 Host heteml
   HostName        {ホスト名}
   User            {ユーザ名}
   Port            2222
   IdentityFile    ~/.ssh/id_rsa_heteml
   IdentitiesOnly  yes
-  PreferredAuthentications password

ssh hetemlでパスワードを聞かれずにログインできたら完了です。

参考: hetemlで公開鍵を使う方法 - Qiita

ちなみに、複数の鍵を登録したい場合は、~/.ssh/authorized_keysに公開鍵の内容をコピーして追記すれば良いです。

Wordmoveを実行してみる

wordmove pullが失敗したのでエラーメッセージを見てみると、依存パッケージがないよと言われていたのでインストール。余談ですが、MacにプリインストールされているRubyだとgemのインストール時にパーミッションエラーではじかれるので、rbenvなどで別途インストールしたほうがよさそうです。

$ gem install rbnacl -v 4.0.0
# 3.2.0以上5.0.0未満なので適当に…(真似しちゃダメよ)
$ gem install rbnacl-libsodium bcrypt_pbkdf

これでもまだエラーが出るのでメッセージを確認。

key was 257 bytes (Expected 32) (RbNaCl::LengthError)

下記のIssueにあるとおり、ssh-addコマンドで解決

SSH Key RbNaCl::LengthError pulling db · Issue #510 · welaika/wordmove · GitHub

$ ssh-add ~/.ssh/id_rsa_heteml

これでwordmoveコマンドが動くようになりました。

フリーランスが独立して再就職手当をもらうまで

2020.01.15 12:01

10月に開業してすぐに手続きを初めて2ヶ月ほど経ち、先日再就職手当が下りました。けっこう時間はかかりますがけっこうな額が出るので、条件が合う人は絶対申請すべきですよ…! 金額は離職時の年齢や賃金によって変わってくるので一概には言えませんが、私の場合は前職のお給料手取り1.5ヶ月分くらいが支給されました。カシオのサイトで計算できるので、一度シミュレーションしてみてから判断してもよいと思います。

再就職手当の受給には下記の条件を満たしている必要があるので、確認しておきましょう。また、再就職手当を受給するにはまず失業手当(基本手当)の受給申請が必要なのですが、そのためには「求職していること(休養、療養、妊娠、出産などで働けない場合は無効)」と「離職日以前2年間に雇用保険の被保険者期間が通算12ヶ月(療養、妊娠、会社都合による退職なら6ヶ月)以上あること」が必要です。合わせて確認してくださいね。

  • 就職日(=開業日)前日の時点で、失業手当(基本手当)の支給残日数が3分の1以上残っていること
  • 1年を超えて勤務することが確定していること
  • 7日間の待機満了日後の就職であること
  • 離職理由による給付制限を受けた場合(自己都合による退職など)は、待機満了日後1ヶ月間は、ハローワークまたは許可・届け出のある職業紹介事業者の紹介により就職したものであること → つまり、独立や自力での転職の場合、最低1ヶ月+7日間空いていなければいけません。
  • 過去3年以内に再就職手当、または常用就職支度手当を受給していないこと
  • 離職前の事業主に再び雇用されたものでないこと → 例えば、独立後前職からの仕事が一定の割合を超えているとこれに引っかかる可能性があります。
  • 受給資格決定前から採用が内定していた事業主に雇用されたものでないこと → 開業日=独立を決めた日や内定日は待機期間より後でなければいけません。

全て満たしていなければ不正受給になり、場合によっては受給金額の3倍の金額を納付するよう命じられることもあります。必ず守りましょう。

同じように退職を考えている方の参考になればと思い、やったことややっておけばよかったことをメモしておきます。

Read more

Advanced Custom FieldsをComposerでインストールする

2019.12.18 13:12

Advanced Custom Fields PROのライセンスプランが来年(2020年)から変更され、買い切りからサブスクリプションになるようです。

ACF | New ACF PRO Pricing for 2020

年内に購入したライセンスは来年以降も有効だそうなので、思い切って買いました。100ドルなので1万円くらいかな…と思っていましたが、よく見るとオーストラリアドル(AUD)なので8000円弱ほどでした。これが来年になると年額249ドルになってしまいます…! カスタムブロックで代替できるとはいえ、クラシックエディタを希望されるクライアントさんもまだ多いので、まだカスタムフィールドの需要はありそうです。

で、PRO版はwpackagistなどのリポジトリには置かれていないため、Composerでインストールすることができません。案件をはじめるたびに毎度コピーするのも面倒なので、なんとかならないものか…と調べたところ、公式フォーラムに似た話題が載っていました。そこで「acf-pro-installer」というそのまんまズバリな名前のパッケージを作られている方がいたのでインストールしようとしたのですが、メンテナンスされておらずvlucas/phpdotenvの依存関係でインストールできませんでした。issueを確認したところ、別のパッケージを作られている方がいたのでそちらを使いました。

インストール方法

ffraenz/private-composer-installer: Composer install helper outsourcing sensitive keys from the package URL into environment variables

READMEに書かれているそのまんまなんですが…。

まず、package.jsonのrepositoriesに下記の項目を追加します。%VERSIONは特に指定しなくてもよいなと思った(公式サイトのダウンロードリンクにもバージョンは指定されてなかった)ので、そこだけ削除してあります。

{
  "type": "package",
  "package": {
    "name": "advanced-custom-fields/advanced-custom-fields-pro",
    "version": "1.2.3",
    "type": "wordpress-plugin",
    "dist": {
      "type": "zip",
      "url": "https://connect.advancedcustomfields.com/index.php?a=download&p=pro&k={%PLUGIN_ACF_KEY}"
    },
    "require": {
      "composer/installers": "^1.4",
      "ffraenz/private-composer-installer": "^3.0"
    }
  }
}

次に、.envにライセンスキーを書きます。なければ新規作成します。

PLUGIN_ACF_KEY={購入したライセンスキー}

最後に、composerでPRO版をインストールします。

$ composer require advanced-custom-fields/advanced-custom-fields-pro

以上です!

.envで変数を使う

2019.12.03 11:12

Wordmove向けにローカルと本番環境両方のDB情報を、Wordpress向けにその環境のDB情報を記載したかったので、下記のようにしました。本番環境の.envでは、${LOCAL_DB_XXXX}${PROD_DB_XXXX}に書き換えます。

LOCAL_DB_NAME=
LOCAL_DB_USER=
LOCAL_DB_PASSWORD=
LOCAL_DB_HOST=
PROD_DB_NAME=
PROD_DB_USER=
PROD_DB_PASSWORD=
PROD_DB_HOST=

# DB
DB_NAME=${LOCAL_DB_NAME}
DB_USER=${LOCAL_DB_USER}
DB_PASSWORD=${LOCAL_DB_PASSWORD}
DB_HOST=${LOCAL_DB_HOST}
1234