web-dev-qa-db-ja.com

混乱 WP 私のプラグインでの臨時使用

私は、ユーザーがメタボックスからAdd Newリンクをクリックすることによって複数の注目の画像を設定し、それらを削除することができる小さなプラグインを作成しました。ユーザーはSet featured imageリンクを使用してメディアライブラリから注目の画像を選択できます。 Add Newリンクは(適切なフィルタを使って)以前のメタボックスを(適切なフィルタを使って)複製して新しいメタボックスを作成し、削除ボタンはメタボックスを削除します。

Metabox snapshot

問題と質問

  1. 私は現在、生成されたすべてのメタボックスに対して単一のナンスフィールドのみを使用しています。以前の多くのスレッドは、新しいナンスフィールドをすべてのメタボックスに追加する必要があることを示唆しています。ボックスがjavascriptを使用して複製されている場合、どのように私は別の一回だけフィールドを作成することができますか? AJAXを使うべきですか?それとも、ユーザーはメディアライブラリから画像を選択することしかできないので、この場合nonceフィールドを使用することさえ必要ですか?

  2. Meta boxの隠し入力フィールドは配列として使われ(meta boxのhtmlを参照)、update_post_metaを使って保存されます。動的に追加されたすべてのメタボックスにnonceフィールドが追加された場合、投稿を保存しながら確認できますか。

if ( !wp_verify_nonce( noncefields..., plugin_basename(__FILE__) ) ) { return; }

メタボックスのHTMLはこのようになっています。

<?php wp_nonce_field( plugin_basename(__FILE__), 'dfi_fimageplug'); //this is generated only once for all meta box ?>
<a href="javascript:void(0)" class='dfiFeaturedImage'><?php _e('Set featured image', 'ap_dfi_dynamic-featured-image') ?></a><br/>      
<img src="<?php if( !empty($featuredImgTrimmed) ) echo site_url() . $featuredImgTrimmed ?>" class='dfiImg <?php if( is_null($featuredImgTrimmed) ) echo 'dfiImgEmpty' ?>'/>
<div class='dfiLinks'>   
 <a href="javascript:void(0)" data-id='<?php echo $featuredId ?>' class='dfiAddNew'><?php _e('Add New', 'ap_dfi_dynamic-featured-image') ?></a>
 <a href="javascript:void(0)" class='dfiRemove'><?php _e('Remove', 'ap_dfi_dynamic-featured-image') ?></a>
</div>
<div class='dfiClearFloat'></div>
<input type='hidden' name="dfiFeatured[]" value="<?php echo $featuredImg ?>" />

私はプラグイン開発の経験があまりなく、この問題に本当に混乱しています。提案してください。

2
Konsole

ナンスは、限られた人生のユニークな数を使います。クローンを作成することはできますが、問題は、一度サーバーに送り返されて検証されると、他のクローンは無効になることです。

これを処理する方法はいくつかあります。

  1. サーバー上のすべてのボックスを生成してJavascriptを破棄します。
  2. クローン作成されたボックスごとに新しいナンスを要求するためにAjaxを使用してください。
  3. 私が選んだ選択肢は、Ajaxを使ってサーバーにクローンの作成を依頼することです。

いずれにせよ、あなたの一回だけはサーバーから来る必要があります。 WPがこれを処理する方法(たとえばCategoriesメタボックスの場合)は、taxonomy名からNonce名を生成することです。あなたはおそらくこれにpostの値か画像名を使うことができます。

<?php wp_nonce_field('add-' . $name, 'add-' . $name . '_nonce', false); ?>

これを行うには、あなたのページの隠しフィールド内に$nameを格納する必要があります。

<input id="<?php echo $name; ?>" type="hidden" value="add-<?php echo $name; ?>" />

あなたのAjaxの中から、ユニークな名前とnonceの両方をサーバーに送って検証し、あなたが望むものを返してください。

あなたの他の質問に関しては "ナンスは必要ですか?"まあ、それは異なります。フォームデータからデータベースに変更を加えるときはいつでも、そうすることが必要です。データを取得するだけの場合は、そうではありません。しかし、ブックマークされているか、どこかにキャッシュされている可能性がある要求を無効にするためには、まだ有用です。正確には思い出せませんが、彼らの一生は約12時間だと思います。

4
Twifty