web-dev-qa-db-ja.com

Polylang:functions.phpのpll_e()およびpll __()、動作しない

私はfunctions.php HTMLのブロックをエコーするいくつかの関数を使っています。問題はカスタム関数pll_e()とpll __()を使うPolylangプラグインにあります。

これらはすべてのテーマでindex.phpで正しく動作しますが、functions.phpでは正しく動作しません。管理者側で登録したとしても、基本的に常にデフォルトの言語文字列が返されます。

したがって、pll_関数を使用してindex.phpに印刷されたブロックは正常に機能します。しかし、同じブロックはfunctions.phpに印刷されており、常に英語です。

これを公式のプラグインサポートフォーラムに投稿しました。まだ回答がありません.

ここに誰かがそれが何でありえるかという考えを持っていますか?

どうもありがとうございます!

1
Lightworker

私はPolylangプラグインについては経験がありませんが、これがPolylangプラグインのロード順序とテーマのfunctions.phpと関係があると想定しても安全だと思います。 index.phpまたは他のテンプレートファイルのグローバルスコープ(つまり、他の関数内からではない)で関数を呼び出すと、WordPressが完全に初期化された後、さらにサーバーの後でも、ページロードプロセスの遅い段階で実行されます。クライアントに応答を送信し始めました。

ただし、functions.phpファイルのグローバルスコープから呼び出された関数は、はるかに早い時点で実行されます。典型的なページロードの間に、本質的に起こることは最初にWordPressがそれ自身をセットアップし、次にプラグインをロードし、そして最後にテーマをロードすることです。ただし、WordPressが完全に初期化されるまで、テーマがロードされるまで、またはページサーバーの応答が開始されるまで利用できない可能性がある機能に依存するため、プラグインによっては考えられるほど直線的ではありません。 WordPressは hooks を使用してこれを解決します。これにより、プラグインまたはテーマはロードプロセス中の特定の段階でコードを実行できます。

長く答えるために ショート さらに長い間、あなたがする必要があるのは、Polylangプラグインの準備が整うまでpll_e()pll__()を呼ばないようにすることです。これはそのソース(あるいはおそらくそのドキュメント)を見れば決定できますが、私はinitフックにフックするだけで十分だろうと思います。 functions.phpのグローバルスコープで呼び出された関数は、initフックの前に実行されますが、initフックを追加することで、後で関数を実行することができます。方法は次のとおりです。

function my_setup() {
    global $some_var;
    $some_var = pll__('A string in need of localization', 'localization_domain'); // This is assuming that this function behaves analogous to __() 

    pll_e("We'll just echo this, somewhere", 'localization_domain');
}
add_action('init', 'my_setup');
1
Simon