WordPress の Contact Form 7 プラグインが動かなくなったときの対処法

症状

WordPress の Contact From 7 プラグインを導入しているサイトで、お問い合わせフォームを送信するとプログレスアイコンが回ったまま送信できない。

お問い合わせ送信時のリクエスPOST /wp-json/contact-form-7/v1/contact-forms/8/feedback を見てみると、コード 404 で次のエラーが返ってきている。

{
	"code": "rest_no_route",
	"message": "URLとリクエストメソッド(request method)に合ったルートがありません",
	"data": {"status": 404}
}

どうも問題が発生する Contact Form 7 のバージョンは 4.8 らしい。

原因1:カスタム投稿タイプの show_in_rest が有効でない

カスタム投稿タイプを使用している場合、register_post_type() でカスタム投稿タイプを作成する際に show_in_rest というオプションを指定する必要がある。

<?php
register_post_type('CustomPage', [
	'public' => true,
	'label' => 'カスタムページ',
	...
	'show_in_rest' => true,
]);

原因2:サーバの設定で rewrite (Apache の場合) が設定されている

サーバが Apache の場合は次の順で原因を調べる。

1. WordPress のインストールディレクトリに .htaccess があれば内容を確認し、/wp-json/... がマッチするルールがないか確認する
2. なければその親ディレクトリを順に調べる
3. それもなければ Apache の設定ファイルを調べる

さくらのレンタルサーバの場合

今回の場合はさくらのレンタルサーバを使用しており、ユーザ領域以外で次のルールが設定されているようだ。

  • URL の末尾にスラッシュ / がなく、ファイルとしてリソースが存在しない場合は自動的にスラッシュ / を付加した URL にリライトする

この動作をユーザ領域で上書きするため、WordPress のインストールディレクトリにある .htaccess に次の設定を記述する。

# /wp-json/ で始まるリクエストは、URL はそのままで index.php で処理する
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/wp-json/ [NC]
RewriteRule .* index.php [L]

動画を Twitter 向けに変換する zsh 関数

Twitter に投稿できる動画の要件は以下のようだ。

  • フレームレートは60fps以下
  • 解像度は32×32から1280x1024の間
  • ファイルサイズは512MBを超えない
  • 時間は0.5秒から140秒の間
  • アスペクト比は1:3から3:1の間
  • ピクセルアスペクト比は必ず1:1
  • YUV420だけサポート
  • AAC-LCだけ、HE-AAC、HEv2-AACはサポートしない
  • 音声チャンネルはモノラルかステレオだけ、5.1チャンネルやそれ以上は不可
  • クローズGOPであること
  • プログレッシブ方式だけでインターレース方式は不可

このうち制限を知らずによく引っかかるのがフレームレート、YUV フォーマット、音声形式なのでそれらを補正するコマンドを用意する (FFmpeg はインストールされているものとする)。また、音声を削除もついでに行うコマンドも用意しておく。

# Twitter 向けに動画を変換する
function video-for-twitter() {
	help() {
		echo 'video-for-twitter'
		echo 'Usage: video-for-twitter input output'
	}
	if [ "$2" = "" ]; then
		help
		return
	fi
	ffmpeg \
		-i $1 \
		-c:v libx264 \
		-c:a aac \
		-vf fps=30 \
		-vf format=yuv420p \
		$2
}

# Twitter 向けに動画を変換する(音声なし)
function video-for-twitter-no-audio() {
	help() {
		echo 'video-for-twitter-no-audio'
		echo 'Usage: video-for-twitter-no-audio input output'
	}
	if [ "$2" = "" ]; then
		help
		return
	fi
	ffmpeg \
		-i $1 \
		-c:v libx264 \
		-an \
		-vf fps=30 \
		-vf format=yuv420p \
		$2
}

Windows 10 タスクバーの検索機能から Web 検索取り除く

次のレジストリ値を登録する。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Search]
"CortanaConsent"=dword:00000000
"BingSearchEnabled"=dword:00000000

Windows 10 で SSH Agent を使用する

Windows 10 でもパスフレーズの入力を省略できる SSH Agent が使えた。

OpenSSH のインストール

PowerShell で次のコマンドを実行することで OpenSSH をインストールできる。

❯ Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

Windowsssh を使っているか確認する。

❯ scoop which ssh
C:\WINDOWS\System32\OpenSSH\ssh.exe

❯ scoop which ssh-add
C:\WINDOWS\System32\OpenSSH\ssh-add.exe

OpenSSH Authentication Agent サービスを有効にする

「サービス (service.msc)」から OpenSSH Authentication Agent の設定を次のように変更する。

  • スタートアップの種類:自動

そしてコンテキストメニューから「開始」を選び、サービスを起動する

SSH の設定ファイルとディレクトリの権限を修正する

SSH の設定ファイルへのアクセスが自分以外のユーザに許可されていると SSH Agent を使用できない。

それを修正するには次のリポジトリに含まれるスクリプトを使用する。

このリポジトリをクローンして次のスクリプトPowerShell から実行する。

❯ ./contrib/win32/openssh/FixUserFilePermissions.ps1

秘密鍵の追加

この手順は Windows 以外の ssh-add と同じ。

❯ ssh-add ~/.ssh/id_dsa.pem
Enter passphrase for ~/.ssh/id_dsa.pem: (パスフレーズを入力する)
Identity added: ~/.ssh/id_dsa.pem

❯ ssh-add -l
登録した鍵一覧が表示される

Git の設定

Git for Windows や Scoop でインストールする Git は初期設定ではそれぞれのパッケージに含んだ ssh コマンドを使用するようになっている。しかしそうすると SSH Agent の恩恵を受けられないので、次の環境変数を設定して Windowsssh コマンドを使用するようにする。

❯ $env:GIT_SSH = "C:\Windows\System32\OpenSSH\ssh.exe"

この設定で上手くいったら Microsoft.PowerShell_profile.ps1 に書き込もう。

コマンドを標準出力したものを PowerShell で実行する

最近 PowerShell からほぼ Linux と同じようなコマンドを実行できるようにしているのだが、 find した結果を sed で整形して実行するにはどうすればいいか迷った。

結論としては | sh とするように | powershell とすればよい。ただし実行されるのは Windows に付属する PowerShell 5.1 である。

例として改行コードを一括で LF に変換したい場合は次のようにする。

fd -t f -e html | sed 's/^/nkf -WwLu --overwrite /' | powershell

ここで使ったコマンドは次の通り。