【メモ書き】Code SnippetsでPHPコードが動かない【$postのスコープ】

【メモ書き】Code SnippetsでPHPコードが動かない【$postのスコープ】 WordPress

こんにちは、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

タイトルとURLをコピーしました