サブタイトル:WordPressの404ページにスケジュール記事としてアクセスした場合にその旨を表示する
概要
どういうことか、まず説明します。
hoge.com/?p=101 という、明日投稿されるように設定された記事があるとします。この記事のURLを、とある他の記事の中で紹介(内部リンク)したくなりました。
「まぁ、明日には見れるようになってるわけだし、見れない記事にリンク貼っても問題ないっしょ」と思い、内部リンクすることに決めました。
さて、これは明日だったからまだいいですが、僕を例にしますと、3ヶ月後まで記事が溜まってたりします。笑
んでもって、実はwordpressのスケジューリング記事には、guid、つまりURLが既に割り振られています。
つまり、未来に投稿される記事のURLを紹介することは容易なわけです。
で話を戻しますと、ずいぶん後に投稿されるってことなら、なおさら、なんらかのメッセージがあったほうがいいですよね。
例えば、p=101に飛ぶと、404にリダイレクトされますが、その404に、”この記事はスケジューリングされた記事です。この記事はxx月xx日に公開が予定されています。タイトル:xxxx 申し訳ありませんが、今しばらくお待ち下さい。”っていうようなことを表示しておく。とか。
これを今回はやっていきます。
解説
まず、テーマフォルダの中の404.phpが要となりますので、これを開きます。んで編集。
<?php
echo "<pre>" ;
// echo "hoge" ;
echo get_post_status ( get_the_ID() ) ;
global $wp;
echo home_url( $wp->request ) ;
echo wp_get_referer() ;
echo $_SERVER['HTTP_REFERER'] ;
echo "<br />" ;
echo $_SERVER['REQUEST_URI'] ;
echo "</pre>" ;
?>
<h2><?php
if ( get_post_status ( 159 ) == 'future' ) {
echo "この投稿はスケジューリングされた投稿です。" ;
}
?></h2>
これの結果が以下
で、ここまでやったわかったことをまとめると、
- 404ページには記事番号の概念がない。
- そのため、get_the_ID()でカレント記事番号を取得して~ってことはできない
- じゃあどうするか、URLから取得する。
- リファラーとかcookieとかネットワークとか色々検証した結果、
$_SERVER['REQUEST_URI']
で取得できることが確認できた。
続いて、取得したURLをパースしていきます。
<?php
echo "<pre>" ;
// echo $_SERVER['REQUEST_URI'] ;
preg_match('/\?p=([0-9]{1,6})/', $_SERVER['REQUEST_URI'] , $matches, PREG_OFFSET_CAPTURE);
// echo var_dump($matches) ;
// echo var_dump($matches[0]) ;
// echo var_dump($matches[1]) ;
echo $matches[1][0] ; => 記事番号 == 159
echo "</pre>" ;
?>
$matches[1][0]で取得できました。
この時点で、スケジューリングされた記事にアクセスが来たら表示する文字列を変更する、ってことは実現できたわけです。
<h2><?php
preg_match('/\?p=([0-9]{1,6})/', $_SERVER['REQUEST_URI'] , $matches, PREG_OFFSET_CAPTURE);
if ( get_post_status ( $matches[1][0] ) == 'future' ) {
echo "この投稿はスケジューリングされた投稿です。" ;
}
?></h2>
…で、ここからは説明が面倒なので、完成形をパパっと紹介します。
<?php
preg_match('/\?p=([0-9]{1,6})/', $_SERVER['REQUEST_URI'] , $matches, PREG_OFFSET_CAPTURE);
$i = function ($v) { return $v; };
if ( get_post_status ( $matches[1][0] ) == 'future' ) {
echo "<h2>" ;
echo "【{$i(get_the_title( $matches[1][0] ))}】はスケジューリングされた投稿です。" ;
// echo "はスケジューリングされた投稿です。" ;
echo "</h2>" ;
echo "<h3>" ;
echo get_the_date("Y/n/j G時", $matches[1][0] ) ;
echo "に公開が予定されています。" ;
echo "<br />" ;
// echo ;
echo "申し訳ありませんが、今しばらくお待ち下さい。" ;
echo "</h3>" ;
}
?>
これはこんな感じにレンダリングされます。
他のスケジュールされた投稿ページもちゃんと動作するか見てみましょう。
ちゃんと出来てるようですね。
当ブログでも同じことをやってみました。
スケジューリングされた投稿の場合:
単なる404エラーの場合: