(WordPress) PHP Notice: Undefined offset: 1 in . /amp.php on line 393 경고 해결하기

워드프레스

wp-content/debug.log에 다음과 같은 PHP Notice가 출력되었을 때 대응 방법을 소개합니다. wp-content/debug.log를 출력하는 방법에 대해서는 여기를 참조하십시오

PHP Notice: Undefined offset: 1 in /var/www/wordpress/wp-content/themes/OOOO/lib/amp.php on line 393

이 경고는 PHP에서 발생하는 것으로, /var/www/wordpress/wp-content/themes/OOOO/lib/amp.php은 해당 경고가 발생한 파일의 경로를 의미하며, on line 393은 해당 경고가 발생한 파일의 393번째 라인에서 발생했음을 의미합니다.

원인 분석

여기서 “Undefined offset: 1“은 “1번째 배열 인덱스의 값이 정의되지 않았습니다“라는 의미입니다. 이 경고는 PHP의 E_NOTICE 오류 레벨로 분류되며, 코드의 실행에는 영향을 미치지 않지만, 디버그 및 유지 보수 목적으로 경고 메시지를 표시합니다.

해결책

해당 경고를 제거하기 위해 먼저 배열이 선언되었는지 확인하고, 인덱스가 정의되어 있는지 확인합니다. 존재하지 않으면 사용하지 않거나 배열의 인덱스를 올바르게 설정하여 해당 경고를 해결할 수 있습니다.

PHP의 E_NOTICE 오류 레벨에 대해서

경고 메시지의 일종으로, 변수가 초기화되지 않았거나 존재하지 않는 변수에 접근하려는 경우 등, 실행 중에 발생할 수 있는 일반적인 오류를 나타냅니다. E_NOTICE 오류는 프로그램의 실행에 직접적인 영향을 미치지 않는 경고이기 때문에, 오류 레벨을 높이지 않으면 무시될 수 있습니다. 하지만 E_NOTICE 오류가 발생하는 것은 프로그램의 안정성을 저해할 수 있으므로, 가능한 이를 방지하기 위해서 변수의 초기화와 존재 여부 등을 체크하고 오류 레벨을 적절하게 설정하는 것이 좋습니다.

수정 하기

다음 함수는 AMP 페이지에서 구글 애드센스 광고를 노출하기 위해 필요한 광고 코드를 생성하는 역할을 합니다. 필요한 경우 이 함수를 호출하여 광고 코드를 생성하고, 원하는 위치에 삽입할 수 있습니다.

379:function generate_amp_adsense_code(){
380:  $adsense_code = null;
381:  if ( get_amp_adsense_code() || is_active_sidebar( 'adsense-300' ) ) {
382:    $ad300 = get_amp_adsense_code();
383:    ob_start();
384:    dynamic_sidebar('adsense-300');
385:    $ad300 .= ob_get_clean();
386:    //var_dump(htmlspecialchars($ad300));
387:    preg_match('/data-ad-client="(ca-pub-[^"]+?)"/i', $ad300, $m);
389:    if (empty($m[1])) return;
390:    $data_ad_client = $m[1];
391:    if (!$data_ad_client) return;
392:    preg_match('/data-ad-slot="([^"]+?)"/i', $ad300, $m);
393:    $data_ad_slot = $m[1];
394:    if (!$data_ad_slot) return;
395:    $adsense_code = '<amp-ad width="300" height="250" type="adsense" data-ad-client="'.$data_ad_client.'" data-ad-slot="'.$data_ad_slot.'"></amp-ad>';
396:    //var_dump(htmlspecialchars($adsense_code));
397:  }
398:  return $adsense_code;
399:}

위 함수는 get_amp_adsense_code() 함수를 호출하여 구글 애드센스 광고 코드를 가져옵니다.만약 광고 코드가 존재하지 않는다면, adsense-300 아이디를 가진 사이드바 위젯을 활성화하고, 해당 위젯에서 광고 코드를 가져옵니다.preg_match() 함수를 사용하여 광고 코드에서 data-ad-clientdata-ad-slot 속성 값을 추출합니다.
추출한 속성 값을 이용하여, amp-ad 요소에 필요한 data-ad-clientdata-ad-slot 속성 값으로 구성된 광고 코드를 생성합니다.생성한 광고 코드를 반환합니다.

오류가 있는 코드는 어디?

preg_match() 함수가 호출되어 정규 표현식을 이용하여 광고 코드에서 data-ad-slot 속성 값을 찾습니다. 그리고 이 값을 $m 변수에 저장합니다. 하지만 만약 정규 표현식이 일치하는 값을 찾지 못하면, $m 변수는 배열이 아닌 false 값을 가지게 됩니다. 그렇기 때문에 $m[1]와 같이 $m 배열의 첫 번째 인덱스를 참조할 때, PHP는 “Undefined offset” 오류를 발생시키고, 1번 인덱스가 존재하지 않음을 알립니다.

preg_match('/data-ad-slot="([^"]+?)"/i', $ad300, $m);
$data_ad_slot = $m[1];
if (!$data_ad_slot) return;

수정 방법 (대응1)

preg_match() 함수에서 data-ad-slot 속성 값을 찾지 못해 false 값을 가지게 될 경우를 대비하여, $m 변수가 배열인지 확인한 후, 배열의 첫 번째 요소를 참조하는 코드를 작성해야 합니다. 예를 들어, 다음과 같이 preg_match() 함수 호출 후 $m 변수가 배열인지 확인하고, 배열의 첫 번째 요소를 참조하는 코드를 작성할 수 있습니다.

if (preg_match('/data-ad-slot="([^"]+?)"/i', $ad300, $m)) {
  $data-ad-slot = $m[1];
} else {
  $data-ad-slot = '';
}
if (!$data_ad_slot) return;

수정 방법 (대응2)

387행~391행과 같은 방법을 사용하여 if (empty($m[1])) return; 코드를 추가합니다. $m[1]Undefined 이면 return합니다.

preg_match('/data-ad-slot="([^"]+?)"/i', $ad300, $m);
if (empty($m[1])) return;
$data_ad_slot = $m[1];
if (!$data_ad_slot) return;

댓글

제목과 URL을 복사했습니다