サイト内でカテゴリー検索後の画面でエラーが出てきたので、その時実施した解決方法をまとめてみました。
1.エラーの詳細
私の場合は以下のようにカテゴリーの検索欄から子カテゴリーを選択して画面遷移した際にエラーが出ました。
子カテゴリーを選択すると、

以下のようなエラーが出ます。
※親カテゴリーの場合はエラーは出ませんでした。

2.原因
エラー内容の通りで、存在しないキーを参照しようとしてエラーとなっています。
今回、以下のようなエラーだったので、
Warning: Undefined array key "name" in ~~/functions.php on line 29
name という存在しないキーを参照しようとしてエラーが発生しており、その場所は functions.php の中の 29 行目 ということが分かります。
3.解決方法
上記の該当箇所に対して、キーを参照する前にキーが存在するかどうかチェックして、キーが存在する場合のみ実行されるようにプログラムを修正することで解決することができます。
例としては以下のようにisset()
関数を利用して修正します。
if( isset($query['name']) ) {
<実行したい処理>
}
isset()
関数は引数に指定した変数に値がセットされているかを確認する関数です。
3-1.具体的な例
上記の例だけだと分かりづらいので今回変更した箇所を記載しておきます。
今回エラーが起きた箇所は以下の記事でも記載している、カテゴリーページで2ページ以降に404エラーが発生するときにfunctions.phpに追記した処理の中で起きました。
この処理に対して修正を加えました。
修正前のプログラム
ハイライトの処理部分でエラーが出ていました。(エラーの Line 29 はこの中では18行目)
if ($query['name'] === $child_category->category_nicename) {
function category_link_custom( $query = array()) {
// カテゴリーのページ送りを修正して404を回避
if(isset($query['name']) && $query['name'] === 'page' && isset($query['page'])) {
$paged = $query['page'];
if(is_numeric($paged)) {
$query['paged'] = (int) $paged;
unset($query['name']);
unset($query['page']);
}
}
// 子カテゴリーの404を回避
if (isset($query['category_name']) && strpos($query['category_name'], '/') === false && isset($query['name'])) {
$parent_category = get_category_by_slug($query['category_name']);
$child_categories = get_categories('child_of='.$parent_category->term_id);
foreach ($child_categories as $child_category) {
if ($query['name'] === $child_category->category_nicename) {
$query['category_name'] = $query['category_name'].'/'.$query['name'];
unset($query['name']);
}
}
}
return $query;
}
add_filter('request', 'category_link_custom');
修正後のプログラム
修正後のプログラムです。
具体的には以下のif文を追加しています。
if( isset($query['name']) ) {
~~~~
}
function category_link_custom( $query = array()) {
// カテゴリーのページ送りを修正して404を回避
if(isset($query['name']) && $query['name'] === 'page' && isset($query['page'])) {
$paged = $query['page'];
if(is_numeric($paged)) {
$query['paged'] = (int) $paged;
unset($query['name']);
unset($query['page']);
}
}
// 子カテゴリーの404を回避
if (isset($query['category_name']) && strpos($query['category_name'], '/') === false && isset($query['name'])) {
$parent_category = get_category_by_slug($query['category_name']);
$child_categories = get_categories('child_of='.$parent_category->term_id);
foreach ($child_categories as $child_category) {
if( isset($query['name']) ) {
if ($query['name'] === $child_category->category_nicename) {
$query['category_name'] = $query['category_name'].'/'.$query['name'];
unset($query['name']);
}
}
}
}
return $query;
}
add_filter('request', 'category_link_custom');