こんにちは、mickです。
Code Snippetsを使ってるときPHPのプログラミングでハマったことのメモ書きです。
わかってしまえばシンプル。
なんだけれどハマるとなかなか抜け出せない。
基本は大事だったというプログラミング(ここではPHP)のスコープの話。
Code Snippetsに書いたPHPコードが動かない
header.phpに書いて使っていたPHPコードを関数化してCode Snippetsで使おうとしたら、意図する結果が得られなくなってしまった。
具体的には、カスタムフィールドに書いたカスタムCSSを使うphpコード。カスタムフィールドに書いたCSSを投稿に反映してくれない。
header.phpに書いて使っていたコード
最初にheader.phpに書いて使っていたコードがこちら。
<?php
if (is_singular())
{
$headinsert = get_post_meta($post->ID, 'custom_css_code' ,true);
if($headinsert)
{
echo '<style>';
echo $headinsert;
echo '</style>';
}
}
?>
これは投稿や固定ページのとき、カスタムフィールドの名前「custom_css_code」から値を取得。
それをヘッダー部分にCSSとして貼り付けるコード。
次にCode Snippetsに書いた(移して関数化した)コード
次に上のコードをCode Snippetsに書き写したのがこちら。
add_action('wp_head', 'cf_custom_css_code');
function cf_custom_css_code(){
if (is_singular())
{
$headinsert = get_post_meta($post->ID, 'custom_css_code' ,true);
if($headinsert)
{
echo '<style>';
echo $headinsert;
echo '</style>';
}
}
}
header.phpに書いていたコードをWordPressのヘッダー部分で使えるように関数化。
このコードが意図する動きをしてくれない。
典型的なデバッグ:プリント文を埋め込んで関数の動作チェック
?><p>ルートチェックn番目<p><?php
こんなコードを埋め込んでこの関数自体が動いてるかチェック。
この結果でわかったのが「$headinsertの値が取れていない」ということ。
さらにそれ以前に「$postの値が取れていない」ということ。
原因:グローバル変数$postのスコープが問題だった
PHPだけでなくプログラミングの基本でもあるスコープ。これが原因。
スコープの関係で関数(function)内では、グローバル変数の「$post」を直接参照することができないから。
PHPの場合、対策は次のコードを加えればOK。
global $post;
実はこれではスマートじゃない。
同じくプログラミングの基本としてなるべくグローバル変数はそのまま使わない。
例えば、謝って$postの値を変更してしまったら最悪WordPressが壊れかねないから。
get_queried_object()を使う
WordPressには$postといったグローバル変数を使うための関数があったので使うことにする。
それが「get_queried_object()」。これを使うと投稿や固定ページのときの「is_singular()が真」ならグローバル変数の$postと同じ値が取れるようになる。
最終的にCode Snippetsに書いたコードがこちら。
add_action('wp_head', 'cf_custom_css_code');
function cf_custom_css_code(){
if (is_singular())
{
$post = get_queried_object();
$headinsert = get_post_meta($post->ID, 'custom_css_code' ,true);
if($headinsert)
{
echo '<style>';
echo $headinsert;
echo '</style>';
}
}
}
まとめ。
header.phpなどphpファイルに直接書いたコードも、関数化していたら$postにアクセスができないので、同じようにハマっていたはず。
関数化するまえのphpコードが動いていたので、余計にハマった感あり。
Code Snippetsは全く関係なかったという話しです。お恥ずかしい。
エラーも出ないし、phpの文法チェックに書けてもエラーがでなかったために、余計に原因にたどり着くのに時間をかけてしまった。
今回はスコープというプログラミングでは基本的な部分が原因。
やっぱり困ったときは、基本の再チェックから、ですね。
初稿 2020/10/30