web-dev-qa-db-ja.com

Get_template_part()によるフォーム送信エラー

私はget_template_part()に関して興味深い問題に遭遇しました。

テーマオプションページ(sitewideSettings.php)を作成しました

通常、私はこれをfunctions.phpに次のように含めます。

include(TEMPLATEPATH."sitewideSettings.php");

これはうまくいきます。

しかし今、私はget_template_part();を使用しようとしています

get_template_part('sitewideSettings');

「更新」をクリックして設定を更新すると、「これを実行してもよろしいですか?もう一度やり直してください」というエラーメッセージが表示されることを除けば、正常に動作します。

「もう一度やり直してください」というリンクがテーマオプションページに戻り、「更新」をクリックするとエラーメッセージが表示され、テーマオプションに戻ります。

get_template_part();の使用以外に何も変わっていません

他に誰もがこの問題に遭遇しますか?どうやってそれを回避しましたか?私はそれが単純で明白なものであると確信しています、しかしそれがまさにそれが完全に私から逃れることです。

(nonceは両方のインスタンスで作成されるため、nonceの問題ではありません)

6
Ashley G

私はあなたがそれが臨時問題ではないと言うのを知っています、しかしそれは明らかにそうです。その通知はデフォルトの「This nonce not checks out」メッセージです。ノンスが失敗する理由は正確にはわかりませんが、それが起こっていることです。

私はあなたのノンスがどのように作成されチェックされるかを二重チェックするでしょう。 wp_nonce_field()を使用している場合は、アクション値と引数値の両方が同じであることを確認してください。また、変数の綴り、またはnonceを失敗させる可能性があるスコープ関連の問題を再確認してください。

編集

それは臨時の問題ではないというあなたの主張をフォローアップする(それはそうです。臨時の問題はスコープの問題によって引き起こされます)、ここでおそらく起こることです。含まれる/必要なファイルはそれらが含まれる範囲で実行されます。私の推測では、あなたはnonceアクションまたはnonce名のいずれかを構築するために変数を使用しています。 get_template_part()はその関数の範囲内にテンプレートファイルを含んでいるので、それはもはやあなたの管理者ページのディスプレイコールバックの範囲内で実行されていません。これらの変数をすべての場所でグローバル化するか、変数の代わりに定数を使用する必要があります。

6
John P Bloch

管理/バックエンドでget_template_part()を使用しないでください。これはテンプレート用に設計されています(テーマの表示、 codex を参照してください)。したがって、これはテーマ内のテンプレートおよびテンプレート部分に使用することを目的としています。

関数リファレンス/テンプレートパーツの取得

テンプレートパーツをテンプレート(ヘッダー、サイドバー、フッター以外)にロードします。子テーマの場合は、テーマがコードの一部を簡単にオーバーロードしやすい方法で再利用することを容易にします。

この関数には実際には一般的なソースコードも含まれていますが、あなたが経験したこと(Johnが指摘したように)はスコープに関連しているかもしれません。私はあなたのコードを知らないので、それがあなたが直面している問題の正確な原因(可変範囲)であるならば、私は確かに言うことができない、それで私はそれを私の答えで単純に保つ傾向がある:

この機能は、管理ページを書くなど、標準のphpコードに置き換えられるようには設計されていません。

だからあなたが本当にあなたがしていることを知らない限りあなたの管理者ページのためにそれを使用しないでください。


更新:

子テーマと親テーマのディレクトリを調べながらphpファイルをグローバルスコープにロードしたい場合は、ファイルを検索する関数を使用できます。 locate_template()

存在する最も優先度の高いテンプレートファイルの名前を取得します。

TEMPLATEPATHの前にSTYLESHEETPATHを検索して、親テーマから継承したテーマが1つのファイルをオーバーロードできるようにします。

あなたの与えられた例のためにinclude(TEMPLATEPATH."sitewideSettings.php");を含めるこれは次のように書くことができます:

include(locate_template('sitewideSettings.php'));

これにより、ファイルをどこにどのようにインクルードするか(include/_once; require/_cone)を制御することができ、NONCEメカニズムを壊すスコープ問題この例ではを持つことができなくなります。


Wp-adminが要求を確認できないため、「もう一度やり直してください」というメッセージが表示されます。具体的には、いわゆる nonce です。それには2つの理由が考えられます。リクエストに何もない(たとえば、フォームが提供していない、または管理コードによって転送または読み取られていない)か、nonceが無効です。ナンスは常に一連のアクションを表します。そのチェーンが壊れている場合は、そのメッセージが表示されます。しかし、メッセージはその連鎖がどこで壊れているのかをあなたに告げるものではありません。

管理者のこれらのエラーメッセージは必ずしも非常に有益ではなく、さらに誤解を招く可能性があります(関連: #14060 )。ここで何が起きているのかを調べるには、チェーンのどの部分が破損しているかが明確になるため、エラーが発生しているシステムでデバッグするのが最も効果的です。

ノンス、管理ページなどの詳細については、テーマまたはプラグイン用の管理ページの作成方法に関するコーデックを参照してください。何らかの理由で、Adminリクエストがノンスを検証することは不可能です。

4
hakre

locate_template( array( 'sitewideSettings.php' ), true )

0
zeo

これは最初の答えのより詳細な説明です - すなわち「範囲はあなたが問題です」

私のget_template_partの簡単な視覚化は次のようになります。

function get_template_part($slug) {
  require("$slug.php");
}

あなたがsitewideSettings.phpに次のものがあるとしたら:

<?php
echo $nonce;
?>

含むテンプレート:

<?php
$nonce = 'xxx';
include('sitewideSettings.php');
?>

(PHPによって)次のように翻訳されます。

<?php
$nonce = 'xxx';
echo $nonce;
?>

get_template_partを含むテンプレート:

<?php
$nonce = 'xxx';
get_template_part('sitewideSettings');
?>

に翻訳される:

<?php
$nonce = 'xxx';
get_template_part(
  echo $nonce;
);
?>

そのため、テンプレート部分にあるものはすべて関数内にラップされ、テンプレート部分にあるすべての変数にはglobalが必要です。

そのためには、sitewideSettings.phpにglobalが必要です。

<?php
$nonce = 'xxx';
get_template_part(
  global $nonce;
  echo $nonce;
);
?>
0
icc97

推測するのは難しい、それは機能の全体のはしごです。 get_template_part()locate_template()を呼び出し、これはrequireを実行するload_template()を呼び出します。

それがget_template_part()なのか、それともその間の関数なのかを判断するために、これらを下から上に試してみることをお勧めします。

0
Rarst