ラック
Home > CMS > 記事 > 2018年1月 > WordPressの固定ページにGETパラメータを付けたら404

WordPressの固定ページにGETパラメータを付けたら404

カテゴリ: WordPress

とあるWordPressサイトで、固定の複合条件によるアーカイブを固定ページで表示させていました。ここでいう「固定の複合条件」とは


        $args = array(
            'post_type' => 'CERTAIN_CUSTOM_POST_TYPE',
            'post_status' => 'publish',
            'order' => 'DESC',
            'orderby' => 'date',
            'meta_query' => array(
                'relation' => 'AND',
                array(
                    'key' => 'EXPIRE_CUSTOMFIELD',
                    'value' => (int)date("U", strtotime($GET_PARAM)),
                    'compare' => '>='
                ),
                array(
                    'key' => 'CERTAIN_CUSTOM_FIELD1',
                    'value' => 'STATUS1',
                    'compare' => '!='
                ),
                array(
                    'key' => 'CERTAIN_CUSTOM_FIELD2',
                    'value' => 'STATUS2',
                    'compare' => '='
                )
            )
        );

こんな感じです。条件をかみ砕くと

  • 特定のカスタム投稿タイプの中で
  • 日付でソート(降順)
  • カスタムフィールドの値でAND条件にマッチするもの
    • 日付(GETパラメータで渡ってきた年、月の1日0時以降)
      • ※「1日の0時以降」の部分は先述のコードの外で定義済みで固定。そのため、GETパラメータで必要なのは「年(4文字)」と「月(2文字)」のみ
    • あるカスタムフィールド(CERTAIN_CUSTOM_FIELD1)の値(STATUS1)と合致しない
    • あるカスタムフィールド(CERTAIN_CUSTOM_FIELD2)の値(STATUS2)と合致

という条件で、WP_Queryをセットしています。

問題

ここで、ある日突然問題が発生しました(今日)。2017年の記事はきちんと取得できるのですが、2018年なので年に2018のパラメータを渡すと、404 Not Found.になってしまうのです。正確には、404.phpの内容が表示されていたので、「WPのテンプレート階層で404に振り分けられてしまっている」という状態です。

調査

何故2018だけダメなのか、と頭を抱えたところに、次の記事を発見。

だいぶ前の記事ですが、心当たりがありました。今回の固定ページでも、GETパラメータの年を渡すname属性はyearにしていたのです。

対処・結果

そこで試しにname属性を「hoge_year」と「year」という文字列以外の文字列にしてみました。すると、正常に固定ページのテンプレートが表示されました。原因は記事と同じく、GETパラメータに「year」を使っていたことのようです。

教訓

WordPressで固定ページにGETパラメータで日付を渡すような処理をするときは、「year」という文字列(WP本体の予約パラメータか何か?)は避ける。「year」だけでなく、「month」など、システム側でも使いそうな名前は避けると、トラブルを予め回避できるかもしれません。

1/11 追記

facebookのコメントで「クエリ変数」という存在を教えて頂きました。

なるほど、これとバッディングしていたのですね……メモメモ……φ(.. )

タグ: トラブル対処,カスタマイズ

 



関連する記事一覧