機能 ショートカットキー
リファレンス(参考URL)一覧へ移動 R
記事URLをMarkDownとしてコピー Ctrl+M
前のコードタグへ移動 Ctrl+←
次のコードタグへ移動 Ctrl+→
ヘルプを表示・非表示 H
Tips
- ショートカットキーは記事上で有効です。ヘッダー/フッター付近では機能しないことがあります。
- コードタグ移動機能がうまく動かないときは、Shift+F5でページを更新してみてください。
- このウィンドウを閉じるには、Hキーをもう一度押してください

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

この記事で欲しい情報が見つからなかった方へ

この記事の更新情報がある場合があります。
この記事は以下の記事とも関連性があると思われます。

WordPressブログを雛形だけコピーしてポートフォリオに加える方法
WordPressにSNSシェアボタンを実装しました [メタ]
WP-CLIでサイトアドレスとWordPress アドレスのURLをSSH経由で変更
SQLでWordPressの記事ごとのメタタグ(メタキーワード)を簡単に確認/編集する
SQLでWordPressの記事を正規表現検索してMarkDown形式にする – 簡単にWordPressブログの記事リンクを取得する方法
SQLでWordPressで非公開の記事を特定して対処する
WordPress タイトルに含む単語をそのままメタキーワードにする [SEO対策]


管理人の方針で、既存の記事の編集はせず、新しい情報や大きな既存情報の更新があった場合には、新しい記事として公開することになっています。
当記事で欲しい情報が見つからなかった・解決に至らなかった場合、これらのリンクがお役に立てるかも知れません。

どうやってこの関連記事を生成しているの?
この機能のPHPソースコード(2500行)

コメントを残す

Close Menu