web-dev-qa-db-ja.com

Functions.phpを使用せずに<body>タグの後にコードを挿入しますか?

GoogleアナリティクスタグとGTMタグのどちらを挿入するかをユーザーが選択できるプラグインを現在作成中です(Googleタグマネージャ)。タグの後にコードを挿入する方法はすでにわかっています。

現時点では、コードは私のテーマのfunction.phpのカスタム関数を通して挿入され、テーマのheader.phpの関数を呼び出します。

Header.php

<?php wp_after_body();?>

Functions.php

function wp_after_body() {
do_action('wp_after_body');
}

しかし、タグの後にコードを挿入するために自分のプラグインファイルを使うことができる解決策があるかどうか私は思っていませんでした(だから私はプラグインを使うたびにテーマファイルを変える必要はありません).

私はすでにこれを試しました:

https://stackoverflow.com/a/27309880/7634982

1
Daan Slurink

あなたは自分のプラグインがテーマに依存しないようにしたいので、あなたはあなたがどんなきちんとしたテーマにもあると仮定するかもしれないフックに頼らなければならないでしょう。現時点ではwp_headwp_footerのみに頼ることができます。 <body>タグ の直後にフックが議論されています しかし、今日それが標準として宣言されたとしても、それを実装していない何千もの既存のテーマがまだあるでしょう。だからそれはあなたのために無駄です。

試したオプションは、ページの大部分をバッファリングするため、バッファの内容を印刷前に変更できます。それは上品には程遠く、ある種のバッファリングを使用して他のプラグインを容易に妨害するかもしれませんが、それはうまくいくはずです。

それで、いいえ、信頼できる方法でこれをする直接的なWordPressy方法はありません。ただし、プラグインでできることはjsonで解決することです。それはいくらかの仕事(そしておそらく学習曲線)を必要とするけれども、その考えはかなり単純です。

wp_headにフックすると、<body>タグの直後にDOM要素を追加するjqueryスクリプトファイルが追加されます。そして 残りのapi を使用して、通常その場所に必要なコードを生成します。

1
cjbj

現時点ではこれは不可能です。これは完全にテーマ領域にあり、あなたは常にテーマコードに依存するでしょう。

しかししかし! 複雑でないコード挿入のために、あなたが使うことができる簡単なハックがあります。私はそれがハックだと言っています、そしてあなたはその理由がわかるでしょう。

あなたがそれを頼りにできることが唯一のテーマの99.99%に存在するであろうことは<body <?php body_class(); ?>>です。それで、私たちはbodyタグに別の 'class'を追加するためにフィルタフックを使うことができます。このコードを見てください。

add_filter( 'body_class', function ( $classes ) {
    return array_merge( 
        $classes, 
        array( '">
            <iframe src="//www.googletagmanager.com/ns.html?id=XXX-XXXXXX" height="0" width="0" style="display:none;visibility:hidden"></iframe>
            <input type="hidden' // Important to handle the closing of the body element
        ) 
    );
} );

ここで何をしましたか?最初にbody要素を閉じるために">を追加しました。それからあなたはあなたが望むどんなHTMLでも挿入することができます。最後の部分も必須です。実際のbody要素のクローズを処理するには、テンプレートを壊さないようなものを作成する必要があります。そのため、隠し入力フィールドがうまく機能するはずです。 <input type="hiddenを追加していますが、">で閉じないでbody_class()関数がそれを行ってくれます。

優先順位によっては、これがbody_classの他のフィルタと衝突する可能性があることに注意してください。これを処理するために、テーマがロードされた後に起動する別のアクションフック、例えばget_headerにこれをラップすることができます。その場合、完全なコードは次のようになります。

add_action( 'get_header', function() {
    add_filter( 'body_class', function ( $classes ) {
        return array_merge(
            $classes,
            array( '">
            <iframe src="//www.googletagmanager.com/ns.html?id=XXX-XXXXXX" height="0" width="0" style="display:none;visibility:hidden"></iframe>
            <input type="hidden' // Important to handle the closing of the body element
            ) );
    } );
});

これはおそらくあなたが望むことをするとしても、私は本当にこれをお勧めすることはできません。

1
dboris