PHP の setcookie には忘れがち(?)な約束があります。
setcookie() は、(中略)<html> や <head> タグはもちろん 空白も含め、あらゆる出力よりも前にこの関数をコールするようにしなければなりません。
この条件を満たす、WordPress でクッキーをセットするベストなタイミングはいつでしょう。
例えば、is_home() を使い訪問者がトップ ページを踏んだかどうかをクッキーに保存し、2回目以降は表示するコンテンツを変えたい場合など、functions.php で大丈夫なのか不安だったりします。
WordPress で setcookie するベストな方法
答えは、get_header アクション フックを使えば完璧です。以下のコードを functions.php に追加します。
add_action( 'get_header', 'my_setcookie'); function my_setcookie() { if ( is_home() ) setcookie( 'visitedHome', 'true', time() + 60*60*24*7, '/' ); setcookie( 'isMobile', wp_is_mobile() ? 'true' : 'false', 0, '/' ); }
Note: This hook is best to use to set up and execute code that doesn’t get echo’d to the browser until later in the page load.
意訳)このフックは setcookie する用途にベストなんだぜ
プチ解説
この方法でセットしたクッキーを JavaScript でも使うときには注意が必要です。例えば上記コードでいうと、クッキー visitedHome は初回のトップ ページ訪問でもセットされています。しかし、PHPで使うとき(例えば home.php)はセットされていません(サーバーにクッキーが送られたあとにセットしているからです)。
setcookie の 3番目のパラメータはクッキーの有効期限で、0 を指定するとセッション クッキー。有効期限を指定したい場合は、1970年 1月 1日からの経過秒数を指定します。そんなの分かるわけないw 上記コードのように現在の日時を取得する time() に期間を秒で加算すれば OK です。上記コードでは 7日間です。
4番目のパラメータはパス指定。以前の記事にも書いたのですが、パスを指定しないと、URL上のディレクトリごとにクッキーが保存されてしまいます。つまり WordPress でスラッグを使ったパーマリンクにしていた場合、記事ごとに別のクッキーになってしまいます。それを避けるため、サイトのルート パスを指定しています。
上記のコードは WordPress サイトがドメインのルート ディレクトリにある場合の例です。クッキーのパスは、あなたのサイトに合わせて設定してください。
トップ ページに初回と 2回目以降で違う固定ページを表示するサンプル
クッキーの有無を判断して、それぞれ別の固定ページの内容をスラッグで取得してトップ ページ(home.php)に表示します。
... <?php if ( isset( $_COOKIE['visitedHome'] )) : ?> <div class="2回目以降"> <?php $page_obj = get_page_by_path( '2回目以降に表示する固定ページのスラッグ' ); $page = get_post( $page_obj ); echo '<h1>' . $page->post_title . '</h1>'; echo $page->post_content; ?> </div> <?php else : ?> <div class="初回"> <?php $page_obj = get_page_by_path( '初回に表示する固定ページのスラッグ' ); $page = get_post( $page_obj ); echo '<h1>' . $page->post_title . '</h1>'; echo $page->post_content; ?> </div> <?php endif; ?> ...
色んな要素が詰まっていて、我ながら このサンプルは使える。シェアしたくなるよね! なるでしょ。