調べて出てきた情報ではどれも実装できず、色々試してどうにかしたのでメモとして。
できない理由とできた理由が明確にはわからないので、あまり参考にしないほうが良いかもしれません。
実現したいこと
- WordPressでボタンを押すとajaxで動作させ、その際にcookieを保存する
- cookieにはsamesite属性をつける
- PHP7.3以上(setcookieのoptionsを使うため)
当サイトページの下部にも付いていますが、自前の投票ボタンの連投防止にcookieを使っているため、これにsamesite属性をつけるのが目的でした。
setcookieとoptionsに関しては以下参照のこと。
なお、サイトが表示されたタイミングでcookieをセットする場合は当記事末尾を参照ください。
サンプル
先に動作したサンプルを記載します。
setcookie('cookie-name', 'cookie-value', [
'expires' => time()+3600,
'path' => '/',
'secure' => true,
'samesite' => 'strict'
]);
上記にはWPのフックはなく、ボタンを押したタイミングでの実行時に動作したものです。
具体的には、$nameと$value以外を配列にまとめれば動いた、となります。
起きた問題
調べても理由がわかっていないのですが、状況は以下のようなものでした。
// フック使用せず、functions.phpではないPHPファイルに記載する場合
// 動作する
setCookie('cookie-name', 'cookie-value');
setCookie('cookie-name', 'cookie-value', time()+3600);
setCookie('cookie-name', 'cookie-value', time()+3600, '/');
setCookie('cookie-name', 'cookie-value', time()+3600, '/', true);
setCookie('cookie-name', 'cookie-value', time()+3600, '/', true, false);
// 動作しない
setCookie('cookie-name', 'cookie-value', time()+3600, ['samesite' => 'strict']);
setCookie('cookie-name', 'cookie-value', time()+3600, '/', true, false, ['samesite' => 'strict']);
setCookie('cookie-name', 'cookie-value', time()+3600, '/; samesite=strict');
- optionsに含めることができるpathなどがoptions外に設定されている場合、optionsにsamesiteを書いても動作しない
php.netでは以下のように書かれていてoptionsの記述と排他的であるとは思えない状況ではあります。
options
expires, path, domain, secure, httponly および samesite のうちから、任意のキーを設定可能な連想配列(array)です。 値については、キーと同じ名前のパラメーターで説明した意味と同じです。 samesite 要素の値は、 None, Lax または Strict です。 上記で許されているオプションのうち、与えられなかったものについては、 デフォルト値は明示的にパラメータを与えた場合のデフォルト値と同じです。 samesite 要素が省略された場合は、SameSite クッキー属性は設定されません。
サーバーの設定なのか、WordPress特有の何かなのか、こちらの勘違いや確認間違いなのか…。
pathに記載する書き方
setcookie('cookie-name', 'cookie-value', time()+3600, '/; SameSite=Strict', '', true, false);
検索では上記のようなpathにsamesiteを記述する方法を見かけますが、PHP7.3以上ではやめたほうがよいのではと思います。詳細は以下がわかりやすいです。
ちなみに今回の調査時に一応試しましたが動きませんでした。
JS側でcookieをセットする
当記事と同じajaxという条件で、かつJS側でのCookie実装であれば上記記事が参考になるかもしれません。
サイトが表示されたタイミングでcookieを設定する
add_action( 'init', 'my_set_cookie', 1 );
function my_set_cookie() {
setcookie('cookie-name', 'cookie-value', [
'expires' => time()+3600,
'path' => '/',
'secure' => true,
'samesite' => 'strict'
]);
}
単にサイトが表示されたタイミングでcookieを設定するだけなら、上記のような感じでfunctions.phpに記載すれば動作します。
使用するフックで最適なものがわからなかったのですが、init以外でも使用自体は可能です。
または、functions.phpに書くのであれば以下のようにfookなしでもセットは可能でした。
setcookie('cookie-name', 'cookie-value', [
'expires' => time()+3600,
'path' => '/',
'secure' => true,
'samesite' => 'strict'
]);
結び
総当たりで試して動く書き方を見つけた感じなので、裏付けが非常に薄い状態です。
単に「samesite属性を使う場合は、全てoptionsに配列で記載する」というルールがあるだけなのかもしれませんが。
何かわかったら追記したいと思います。
0人がこの記事を評価
役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。
連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。