古いテーマの修正例#3

function loopHTML( $atts, $content = null ) { 
$html = ""; extract( shortcode_atts( array( 'texts1'=>'', 'texts2'=>'', 'texts3'=>'' ), $atts ) );
$texts = array(
explode( ",", $texts1 ),
explode( ",", $texts2 ),
explode( ",", $texts3 )
); $i = 0;
foreach ( $texts[0] as $text ) {
$temp = $content;
for ( $j=1; $j<=3; $j++ ) {
$temp = str_replace( "#text{$j}#", $texts[$j-1][$i], $temp );
}
$html .= $temp; $i++;
}
return do_shortcode($html);
}
add_shortcode('loop', 'loopHTML');

$temp = str_replace( "#text{$j}#", $texts[$j-1][$i], $temp );の箇所でエラー。Notice: Undefined offset: 1

とりあえず整形してみてもこれが何をやりたいのかも分かりにくい…。foreachの$textがその後使われてない。

実際に使ってる箇所は固定ページで何かメニューを表示。[loop texts1="パスタ,ランチ,スイーツ,ドリンク"]$contentになるhtml[/loop]

$content内の#text1#パスタに置き換える、と…。それをドリンクまで4回繰り返し。

loop内でさらに別のショートコードを呼んでる。そっちでもforeachの使い方間違ってるしいや待ったそんな所から…?

修正後。texts2や3は使われてない。shortcode_attsは省略時の初期値のためだしなくてもよさそう。

add_shortcode('loop', function ($atts, $content = null) {
$attrs = shortcode_atts(['texts1' => ''], $atts);

$html = '';

$texts = explode(',', $attrs['texts1']);

foreach ($texts as $text) {
$html .= str_replace('#text1#', $text, $content);
}

return do_shortcode($html);
});

extractが禁止されるのもよく分かる…。配列から変数が生まれるとかいにしえのregister_globalsに近いリスクがある。

texts2も使いたくなったら困るかもしれないけどそもそもこんな複雑なことをショートコードでやってるのが。固定ページ1箇所で使ってるだけなんだからそのままhtmlで書くかテーマで実装したほうがいい。1回しか使わないショートコードに価値はない。

修正していくと設計段階で間違ってることが多い…。