WordPressでPHPのバージョンによって関数の定義などの厳密化が進んでいます。上記のWarning: Undefined array key 1 in・・・・。というエラーもその中のひとつです。かなり以前の記事になりますが、以下にAdSense広告を任意の位置に表示させる方法などとしてコードを公開しました。今回のWarning: Undefined array key 1 in /home/・・・・・・・・・・・・/functions.php on line 509は、そのコードをカスタマイズしたものとしてずっとfunction.php内に記載していたことが原因でした。
上記カスタマイズ方法として、AdSense広告をPC・スマホ・タブレットと分岐してそれぞれのH2タグの前にAdSense広告コードやアフィリエイトコードや忍者adなど自動的に表示されるようにしたコードです。
以下に当時の全てのコードを記載しておきますが、各々にて必要のないところは削除しても問題ないです。
/*最初と最後のh2見出しタグの直前にアドセンスなどの広告を表示(PCとスマホやタブレット端末の切り替え)ここから*/
function add_ad_before_h2_for_2times($the_content) {
//スマホとタブレット端末で一番はじめのh2見出しタグ直前に表示させる広告コード
$ad1 = <<< EOF
(ここに広告コードを記述)
EOF;
//スマホとタブレット端末で一番最後のh2見出しタグに直前に表示させる広告コード
$ad2 = <<< EOF
(ここに広告コードを記述)
EOF;
//PCで一番はじめのh2見出しタグ直前に表示させる広告コード
$ad3 = <<< EOF
(ここに広告コードを記述)
EOF;
//PCで一番最後のh2見出しタグ直前に表示させる広告コード
$ad4 = <<< EOF
(ここに広告コードを記述)
EOF;
if ( is_single() ) {//投稿ページ
$h2 = '/^<h2.*?>.+?</h2>$/im';//h2見出しのパターン
if ( preg_match_all( $h2, $the_content, $h2s )) {//h2見出しが本文中にあるかどうか
if ( $h2s
[0]
) {//一応チェック
if (is_mobile()){//スマホとタブレット端末表示
if ( $h2s
[0]
[0]
) {//1番目のh2見出し直前にad1を挿入
$the_content = str_replace($h2s
[0]
[0]
, $ad1.$h2s
[0]
[0]
, $the_content);
}
if ( $h2s
[0]
[1]
) {////h2が2個以上なら最後のh2見出し直前にad2を挿入
$the_content = str_replace($h2s
[0]
[count($h2s[0]
) - 1], $ad2.$h2s
[0]
[count($h2s[0]
) - 1], $the_content);
}
} else {//PC表示
if ( $h2s
[0]
[0]
) {//1番目のh2見出し直前にad3を挿入
$the_content = str_replace($h2s
[0]
[0]
, $ad3.$h2s
[0]
[0]
, $the_content);
}
if ( $h2s
[0]
[1]
) {////h2が2個以上なら最後のh2見出し手前にad4を挿入
$the_content = str_replace($h2s
[0]
[count($h2s[0]
) - 1], $ad4.$h2s
[0]
[count($h2s[0]
) - 1], $the_content);
}
}
}
}
}
return $the_content;
}
add_filter('the_content','add_ad_before_h2_for_2times');
/*最初と最後のh2見出しタグの直前にアドセンスなどの広告を表示(PCとスマホやタブレット端末の切り替え)ここまで*/上記コードをカスタマイズして、以下のようにしてAdSense広告コードやアフィリエイトコードなど何も使用していない状態でした。
/*アドセンススマホh2一番下の上とPCh2一番下の上に自動表示ここから*/
//最初と最後のh2見出し手前にアドセンスを表示(PC・スマホ切り替え)
function add_ad_before_h2_for_2times($the_content) {
//スマホで2番目に表示させるアドセンス
$ad2 = <<< EOF
<!--ここにスマホ用のAdSense広告コードがあった-->
EOF;
//PCで2番目に表示させるアドセンス
$ad4 = <<< EOF
<!--ここにAdSense広告コード-->
EOF;
if ( is_single() ) {//投稿ページ
$h2 = '/^<h2.*?>.+?<\/h2>$/im';//H2見出しのパターン
if ( preg_match_all( $h2, $the_content, $h2s )) {//H2見出しが本文中にあるかどうか
if ( $h2s[0] ) {//チェックは不要と思うけど一応
if (st_is_mobile()){//スマホ表示
if ( $h2s[0][1] ) {////H2が2個以上なら最後のH2見出し手前にad2を挿入
$the_content = str_replace($h2s[0][count($h2s[0]) - 1], $ad2.$h2s[0][count($h2s[0]) - 1], $the_content);
}
} else {//PC表示
if ( $h2s[0][1] ) {////H2が2個以上なら最後のH2見出し手前にad4を挿入
$the_content = str_replace($h2s[0][count($h2s[0]) - 1], $ad4.$h2s[0][count($h2s[0]) - 1], $the_content);
}
}
}
}
}
return $the_content;
}
add_filter('the_content','add_ad_before_h2_for_2times');
/*アドセンススマホH2一番下の上とPCh2一番下の上に自動表示ここまで*/上記コードの「if ( $h2s[0][1] ) {////H2が2個以上なら最後のH2見出し手前にad4を挿入」で特定の記事にてWarning: Undefined array key 1 in ・・・・・・・・・/functions.php on line 509」とひょうじされるのは、理由としては以下が原因内容です。
Warning: Undefined array key 1 というエラーは、配列 $h2s[0] に インデックス 1 が存在しない(つまり H2 見出しが 2 個以上ない)場合に出ています。
現在のコードでは存在確認をせずに $h2s[0][1] をそのまま使っているので、1 個しか H2 がない記事でエラーになります。
当たり前といえば当たり前なのですが、またPHP8以降は厳正化されてきたのも要因です。(それまではある程度曖昧でもエラーは出ませんでした。
なので、上記部分を安全な方法にて修正します。
安全な修正方法、isset() を使って配列のキーが存在するかチェックしてから処理するのが安全です。
部分的な修正コードとしては以下のようになります。
if ( isset($h2s[0][1]) ) { // H2が2個以上あれば
if (st_is_mobile()){ // スマホ表示
$the_content = str_replace(
$h2s[0][count($h2s[0]) - 1],
$ad2.$h2s[0][count($h2s[0]) - 1],
$the_content
);
} else { // PC表示
$the_content = str_replace(
$h2s[0][count($h2s[0]) - 1],
$ad4.$h2s[0][count($h2s[0]) - 1],
$the_content
);
}
}
ポイントとしては、以下の3点になっています。
- isset($h2s[0][1]) は 配列のインデックスが存在するかどうかを確認します
- これで H2 が 1 個しかない場合は処理がスキップされ、警告は出ません。
- 元のコードの構造は変えずに安全化できます。
さらに安全なコードとしては以下コードですね。
if ( count($h2s[0]) > 1 ) {
// ここにスマホ・PC共通の挿入処理
}
上記を踏まえて全体の修正したコードは以下のようになります。H2が2個以上ある場合のみ挿入 するよう安全化したバージョンです。
/* アドセンススマホH2一番下の上とPCh2一番下の上に自動表示ここから */
// 最初と最後のh2見出し手前にアドセンスを表示(PC・スマホ切り替え)
function add_ad_before_h2_for_2times($the_content) {
// スマホで2番目に表示させるアドセンス
$ad2 = <<< EOF
<!-- ここにスマホ用のAdSense広告コード -->
EOF;
// PCで2番目に表示させるアドセンス
$ad4 = <<< EOF
<!-- ここにPC用のAdSense広告コード -->
EOF;
if ( is_single() ) { // 投稿ページ
$h2_pattern = '/^<h2.*?>.+?<\/h2>$/im'; // H2見出しのパターン
if ( preg_match_all( $h2_pattern, $the_content, $h2s ) ) { // H2見出しが本文中にあるかどうか
if ( isset($h2s[0]) && count($h2s[0]) > 1 ) { // H2が2個以上ある場合のみ
if ( st_is_mobile() ) { // スマホ表示
$the_content = str_replace(
$h2s[0][count($h2s[0]) - 1],
$ad2 . $h2s[0][count($h2s[0]) - 1],
$the_content
);
} else { // PC表示
$the_content = str_replace(
$h2s[0][count($h2s[0]) - 1],
$ad4 . $h2s[0][count($h2s[0]) - 1],
$the_content
);
}
}
}
}
return $the_content;
}
add_filter('the_content', 'add_ad_before_h2_for_2times');
/* アドセンススマホH2一番下の上とPCh2一番下の上に自動表示ここまで */
黄色い部分のisset()関数になっています。
修正ポイントとしては以下のようになります。
- if ( isset($h2s[0][1]) ) を if ( isset($h2s[0]) && count($h2s[0]) > 1 ) に変更
→ H2が2個以上ある場合のみ広告挿入。 - スマホ・PC判定内の処理は同じまま。
- $h2s[0] が空の場合や H2が1個しかない記事でも 警告が出なくなる。
最後の部分の警告が出なくなるということが重要です。今後の安定運用の為にもisset()関数は覚えておくとよいですね。
以下のサイトが非常にわかりやすくまとめてくれてありました。ありがとうございます。
あなたにおすすめ
関連記事
-
-
ナビテレビが見れなくなった時ICカードが正常に動作しませんでした対処方法
本日ではなく昨日になってしまいますが、それまでカーナビで地デジ対応のナビで突然エンジンをかけなおしたら・・・・・・。 「ICカードが正常に動作しませんでした。販売店にお問い合わせください。」 なんてい…
-
-
日産ディーラーオプションナビMM316D-WからMM518D-L交換(換装)NISSAN純正ナビリモコン
ある程度、年式がたった車においてはディーラーオプションナビ(DOP)やメーカーオプションナビ(MOP)の地図データが古くなったり、ナビのモニタインチ数が大きくなったりします。地図データが古くなるのはも…
-
-
車のキーナンバー確認方法。キーレス紛失や壊れた時
初めての経験でした。(汗)…。 キーレスエントリー、キーレスリモコンがついた鍵がエンジンを回す時にボキッと折れてしまいました。(汗)…。 プラスチックの本体部分と鉄のキー部分が分裂してしまいました。 …
入学入社まであと…入学入社祝いはどんなPresent(プレゼント)でどのように過ごされますか?
ホワイトデープレゼントは以下などの豊富なキャンペーン商品から選ぶと良いと思います。
おすすめの記事一部広告
- 車のキーナンバー確認方法。キーレス紛失や壊れた時124
- カーメイトのエンジンスターターでエラー15表示と対処方法114
- ナビテレビが見れなくなった時ICカードが正常に動作しませんでした対処方法113
- TOYOTAキーレスリモコンの設定方法とキーナンバー(キー番号)85
- ECUをリセットする方法。アイドリング不安定だったのでしょうがなく84
- 日産ディーラーオプションナビMM316D-WからMM518D-L交換(換装)NISSAN純正ナビリモコン84
- キーIDが正しくありません。エクストレイルT32インテリジェントキー電池交換CR203282
- エクストレイルT32運転席側バイザーメッキモール剥がれ修復方法とオススメ両面テープ65
- アルミテープチューン貼る場所で燃費向上と走行性能アップTOYOTAの特許を試してみた63
- アイドリングストップシステム異常警告灯表示対処方法62










新着コメント