【WordPress】is_xxxx()という関数は用法用量を守って使いましょう。
皆様ご無沙汰しております。yamashitaです。
今回はWordPressの関数を使うにあたって、気を付ける点を書こうと思います。
開発時に使ってみたら全然動かなくてパニックになったので調べてみました。
主な関数はis_page(),is_single(),is_archive(),is_attachement()など、表示するページの種類を判定する関数です。
おそらくこのファイルにある関数が主な対象です。
https://github.com/WordPress/WordPress/blob/master/wp-includes/query.php
どういう風に失敗したのか。
カスタム投稿を含めた特定の投稿やアーカイブ、一部のユーザーからのアクセスが出来ないようにしたかったのですが、
functions.phpに以下のような記述をしました。
if(is_post_type_archive("sample-post") && current_user_can("guest")) {
// 任意のリダイレクト処理
}
「functionsと名の付くファイルに関数以外を書くな」と言われればそれまでです。ごめんなさい。
この条件文に囲われたリダイレクト処理は最後まで役目を果たすことはありませんでした。
何がいけなかったのか
察しのいい方はお気づきかもしれません。is_post_type_archive()などはquery.phpにあるのです。
つまりクエリを基に色々な関数が動いています。
基本的な構造は同じなので関数の中を見てみましょう。
function is_archive()
{
global $wp_query;
if (!isset($wp_query)) {
_doing_it_wrong(__FUNCTION__, __('Conditional query tags do not work before the query is run. Before then, they always return false.'), '3.1.0');
return false;
}
return $wp_query->is_archive();
}
グローバルの$wp_queryを参照して結果を返しています。
先ほどの書き方ではこの$wp_queryが作られていませんでした。
そのため、実際に想定している条件のページやユーザーでアクセスしても、判定がtrueにならなかったのです。
どうすればいいのか
簡単です。関数化してアクションフックかテンプレートで呼び出してください。
フックはparse_query以降です。
テンプレートを読み込むタイミングのtemplate_redirectが個人的におすすめです。
結論
functions.phpには関数以外書かない方が身のためです。
WordPressのファイルの読み込み順などは知ってはいるもののそこまで意識して開発が出来ていませんでした。
リクエストが届いてからの処理順を改めて勉強したほうがいいなと思いました。