WordPressの子テーマにあるfunctions.phpからis_page()やis_single()を使う方法とは?

子テーマのfuncitons.phpに限らず親テーマのfunctions.php

どちらに記載しても構わないのですが、条件分岐にて特定の投稿is_single()や固定ページis_page()を表示している時のみ、ヘッダーにcssやscriptタグを出力するコードを記述したのですが正常に動かない。

条件分岐にてnullを返し動作をしていない。という事があったので解決策を備忘録として残しておきます。

目次

解決策:フック内にて使用する

funcitons.phpに記載されているコードは優先順位が高く起動時に読み込まれます。

この段階では未だqueryコンテンツが読み込まれていないので、ページに対する情報は保持していません。その結果is_single()is_page()を使っても必ずnullが返ってくるのです。

よって既にqueryコンテンツが読み込まれているフック内にて使用すれば問題解決します。

例)Contact Form 7のタグを削除

// Contact Form 7 タグ削除
add_filter('wpcf7_load_js', '__return_false');
add_filter('wpcf7_load_css', '__return_false');

add_action('wp_enqueue_scripts', function () {
    // Contact Form 7有効
    if (is_page('contact-us')) {
        if (function_exists('wpcf7_enqueue_scripts')) {
            wpcf7_enqueue_scripts();
        }
        if (function_exists('wpcf7_enqueue_styles')) {
            wpcf7_enqueue_styles();
        }
    }
}, 11);

add_action()などのフック内で使用すると問題なく動作するので、必ずフック内で使うようにしましょう。

失敗したコード

当サイトではContact Form 7を使っているため、お問い合わせフォームのページのみに必要なcssとjavascriptを出力したいと思い、functions.phpに以下のコードを記載してみました。

動かないコードなので使わないように

// Contact Form 7 タグ削除
add_filter('wpcf7_load_js', '__return_false');
add_filter('wpcf7_load_css', '__return_false');

// Contact Form 7有効
if (is_page('contact-us')) {
    add_action('wp_enqueue_scripts', function () {
        if (function_exists('wpcf7_enqueue_scripts')) {
            wpcf7_enqueue_scripts();
        }
        if (function_exists('wpcf7_enqueue_styles')) {
            wpcf7_enqueue_styles();
        }
    }, 11);
}

想定する動作をするならばcontact-usのスラッグを持つページにてContact Form 7 タグが出力されるはずなのですが、何故か該当ページにて動作せず。

なぜだ?と調べた結果、フック内にて条件分岐しないと動作しないという事が分かりました。

is_admin()などは問題なく動く

管理画面かそうでないかの条件分岐はフック外で正常に動きます。

例えば上記のContact Form 7のコードは管理画面で動かす必要はないので以下の様にも書けます。

管理画面以外のフロントページでのみ動作させる

if (!is_admin()) {
    // Contact Form 7 タグ削除
    add_filter('wpcf7_load_js', '__return_false');
    add_filter('wpcf7_load_css', '__return_false');

    // Contact Form 7有効
    add_action('wp_enqueue_scripts', function () {
        if (is_page('contact-us')) {
            if (function_exists('wpcf7_enqueue_scripts')) {
                wpcf7_enqueue_scripts();
            }
            if (function_exists('wpcf7_enqueue_styles')) {
                wpcf7_enqueue_styles();
            }
        }
    }, 11);
}

is_admin()が正常に動いたからこそis_page()も同様に書いてしまい、なぜ動かない?と躓いたのかも・・・。

あとがき

原因が分かってしまえば、なんて事ない簡単な理由なのですが、WordPressの内部構造を知らないと、ちょっと躓いてしまいますよね。

初心者の頃はこういった専門家なら当たり前のことも、調べてみないと分からないものです。

もし誰かが同じ不都合で悩んでおり、この記事が解決の助けになったのなら嬉しいです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

このサイトはreCAPTCHAによって保護されており、Googleのプライバシーポリシー利用規約が適用されます。

reCAPTCHAの認証時間が切れたため、ページを再読み込みしてください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次