it-swarm.com.de

Verwirrung weiter WP Nichtgebrauch in meinem Plugin

Ich habe ein kleines Plugin erstellt, in dem Benutzer mehrere Bildfeatures festlegen können, indem sie auf den Link Add New in der Meta-Box klicken und diese ebenfalls entfernen. Der Benutzer kann den Link Set featured image verwenden, um ein ausgewähltes Bild aus der Medienbibliothek auszuwählen. Der Add New-Link klont (mit Javascript) die vorherige Meta-Box (mit entsprechenden Filtern), um eine neue Meta-Box zu erstellen, während die Schaltfläche zum Entfernen die Meta-Box entfernt.

Metabox snapshot

Problem und Fragen

  1. Ich verwende derzeit nur ein einziges Nonce-Feld für jede generierte Meta-Box. Viele frühere Threads schlagen vor, dass für jede Meta-Box ein neues Nonce-Feld hinzugefügt werden sollte. Wie kann ich ein anderes Nonce-Feld erstellen, wenn die Box mit Javascript geklont wird? Soll ich AJAX verwenden? Oder muss in diesem Fall sogar das Feld nonce verwendet werden, da der Benutzer nur ein Bild aus der Medienbibliothek auswählen kann?

  2. Das versteckte Eingabefeld in der Meta-Box wird als Array verwendet (siehe HTML für die Meta-Box) und mit update_post_meta gespeichert. Wenn das Nonce-Feld für jedes dynamisch hinzugefügte Meta-Feld hinzugefügt wird, wie kann ich es beim Speichern des Beitrags überprüfen?

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

Das HTML für die Meta Box sieht so aus.

<?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 ?>" />

Ich bin nicht sehr erfahren in der Plugin-Entwicklung und bin in dieser Angelegenheit wirklich verwirrt. Bitte vorschlagen.

2
Konsole

Nonces sind einmalig verwendbare, lebenslange eindeutige Nummern. Sie können sie klonen, aber das Problem ist, dass die anderen Klone ungültig werden, sobald sie an den Server zurückgesendet und validiert wurden.

Sie haben ein paar Möglichkeiten, damit umzugehen.

  1. Generieren Sie alle Ihre Boxen auf dem Server und verwerfen Sie das Javascript.
  2. Verwenden Sie Ajax, um für jede geklonte Box eine neue Nonce anzufordern.
  3. Meine bevorzugte Wahl ist "Ajax verwenden", um den Server aufzufordern, den Klon zu erstellen.

In jedem Fall muss Ihre Nonce vom Server stammen. Die Art und Weise, wie WP damit umgeht (zum Beispiel für die Metabox Categories), besteht darin, den Nonce-Namen aus dem Namen taxonomy zu generieren. Sie können hierfür möglicherweise den Post-Wert oder den Bildnamen verwenden.

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

Dazu müssten Sie den $name auch in einem ausgeblendeten Feld auf Ihrer Seite speichern.

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

Senden Sie in Ihrem Ajax sowohl den eindeutigen Namen als auch das Nonce an den Server, und geben Sie alles zurück, was Sie möchten.

Wie für Ihre andere Frage "Ist das Nonce notwendig?". Es hängt davon ab. Ich würde vorschlagen, wann immer Sie Änderungen an Ihrer Datenbank aus Formulardaten vornehmen, dann sind sie ja erforderlich. Wenn Sie nur Daten abrufen, ist dies nicht der Fall. Sie können jedoch weiterhin zum Ungültigmachen von Anforderungen verwendet werden, die möglicherweise mit einem Lesezeichen versehen oder irgendwo zwischengespeichert wurden. Ich kann mich nicht genau erinnern, ich glaube, ihre Lebensdauer beträgt ungefähr 12 Stunden.

4
Twifty