wordpressの特定ページで404エラーを返す方法

wordpressのテーマにはデフォルトで404.phpというテンプレートが用意されています。このテンプレートがあれば、存在しないURLに対して自動的に404ステータスコードを返すようになっています。しかし、wordpressを運用していると時として、200以外のステータスコードを返したい場合があったりします。

ステータスコードとは

ステータスコードはサーバの応答のことです。三桁の数字から構成されており、100番から500番台の間で割り当てられています。このうち404番は、ページが存在しない場合に出力されます。リソースが見つからない、或いは未検出とも表現されます。ちなみに200番はリクエストに成功した時に返されるステータスコードです。

wordpressで404エラーを返す方法

wordpressで404を返すには、以下のようなコードをheader.phpの一番上に記述します。この例ではwordpressのスラッグを取得して404を返すべきページを判定していますが、URLの構成がIDを利用したものであれば、IDで判定したほうが視認性に優れます。IDのURLはスラッグの保存にタイトルを使っており、その中に日本語があればURLエンコードによって長くなるためです。

if(!empty($wp_query->get_queried_object()->post_name)){
$slug=$wp_query->get_queried_object()->post_name;
}
$ary=['page1','page2'];
if(!empty($slug) && in_array($slug,$ary)){
header(' ', true, 404);
exit;
}

wordpress上で404を確認するには?

以下のようなコードをwordpressのテンプレート上のどこかに貼り付けます。is_user_logged_inで条件分岐していますので、wordpressでログインしているユーザにしか表示されないようになっています。ただ、テンプレートを直接触りますので、バックアップをとっておくと良いでしょう。また、ワードプレスの仕様変更によって動作しない関数が存在するときちんと表示されないこともあるため、その時はいつでもバックアップしたテンプレートをアップロードできるようにしておく方が無難です。

if(is_user_logged_in()){
$nt=preg_replace('/\/$/', '', network_home_url('','https'));
$nt=$nt.$_SERVER['REQUEST_URI'];
if(empty($_POST["address"])){$_POST["address"]="";}
$esc="htmlspecialchars";
echo <<< EOM
<div style="text-align:center;margin-top:100px;">
<div style="padding-top:50px;">ステータスコード</div>
<form action="{$nt}" method="post">URL<input type="text" size="40" name="address" value="{$esc($_POST["address"])}" /> <input type="submit" value="確認" /></form>
</div>
EOM;
if(preg_match('/^[0-9a-zA-Z.\/:\-_]+$/mu', $_POST["address"])){
$scode=CurlLoad($_POST["address"]);
$_POST["address"]=$result="";
$result.='<tr><td>ホスト名</td><td>'.gethostbyaddr($scode["primary_ip"]).'</td></tr>';
$result.= '<tr><td>IPアドレス</td><td>'.$scode["primary_ip"].'</td></tr>';
$result.='<tr><td>ステータスコード </td><td>'.$scode["http_code"].'</td></tr>';
echo '<table style="text-align:left;margin: 0 auto;">'.$result.'</table>';
}
}
function CurlLoad($url) {
$code= null;
$ch = curl_init($url);
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true,CURLOPT_USERAGENT => "spider",]);
curl_exec($ch);
$code= curl_getinfo($ch);
curl_close($ch);
return $code;
}

他にブラウザのデベロッパーツールやWindows上で動作するCURLアプリケーションをインストールするといった確認方法もあります。

.htaccessで404エラーを出力

ドメイン直下の「.htaccess」ファイルへ以下のように記述します。ドメイン直下とは、example.com/.htaccessという形になります。下の例だと、example.com/404.htmlがパスとなります。この方法はワードプレスに限らず、一般のウェブサイト全般に有効です。

ページが存在しない場合、全て404.htmlを表示。

ErrorDocument 404 /404.html

特定の記事のみ

RewriteEngine On
RewriteRule ^wordpress.html$ - [R=404,L]

カテゴリー以下の記事すべて。

RewriteEngine On
RewriteRule ^wordpress/ - [R=404,L]

カテゴリーのみ404でカテゴリー以下の記事は表示する。

RewriteEngine On
RewriteRule ^wordpress/$ - [R=404,L]

永久に消滅したことを意味する410エラーを返したい場合。

RewriteEngine On
RewriteRule ^wordpress\.html$ - [G]

ワードプレスというディレクトリ内ファイルを永久に全て削除したい場合。

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/wordpress/
RewriteRule .* - [G]

まとめ

ワープレに限ったことではありませんが、ステータスコードを変えたいケースもあると思います。ワープレの場合、スラッグやIDなど、記事固有の情報があるため、それを用いて条件分岐することが可能です。該当記事のスラッグなどを配列化させると複数ページにも対応できますので、ワープレ上で記事を残したい場合は、重宝するかも知れません。