WordPress URLによって404ページの内容を変更する

    >


サブタイトル: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>

これの結果が以下

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_a421bdef-685f-4359-a8a4-72d8a1044939.png

で、ここまでやったわかったことをまとめると、

  • 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>" ;
        }

?>

これはこんな感じにレンダリングされます。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_aa98efda-b186-4ff1-9256-e13ddf3297f4.png

他のスケジュールされた投稿ページもちゃんと動作するか見てみましょう。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_b9068264-e858-4c42-ad9d-265fce04e27d.png

ちゃんと出来てるようですね。

当ブログでも同じことをやってみました。

スケジューリングされた投稿の場合:

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_a0d456fd-8fd6-43d4-b3b0-06a81000748b.png

単なる404エラーの場合:

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_63eceb3f-5c27-4821-9a82-7ec1a1eb25da.png





お困りですか?この記事で紹介していることをマンツーマンで指導、解説、代行します。まずはお気軽にお問い合わせください。


Close Menu