web-dev-qa-db-fra.com

Confusion sur WP Utilisation de nonce dans mon plugin

J'ai créé un petit plugin où les utilisateurs peuvent définir plusieurs images en cliquant sur le lien Add New dans la boîte méta et les supprimer également. L'utilisateur peut utiliser le lien Set featured image pour sélectionner l'image sélectionnée dans la bibliothèque multimédia. Le lien Add New clone (à l'aide de javascript) la méta-boîte précédente (avec les filtres appropriés) pour créer une nouvelle méta-boîte alors que le bouton de suppression supprime la méta-boîte.

Metabox snapshot

Problème et questions

  1. J'utilise actuellement un seul champ nonce pour chaque méta-boîte générée. Beaucoup de discussions précédentes suggèrent d'ajouter un nouveau champ de nonce pour chaque boîte méta. Comment puis-je créer différents champs de nonce si la boîte est clonée à l'aide de javascript? Devrais-je utiliser AJAX? ou est-il même nécessaire d'utiliser un champ nonce dans ce cas, car l'utilisateur ne peut sélectionner qu'une image dans une bibliothèque multimédia?

  2. Le champ de saisie masqué dans la boîte méta est utilisé comme un tableau (voir html pour la boîte méta) et est enregistré à l'aide de update_post_meta. Si le champ nonce est ajouté pour chaque méta-boîte ajoutée dynamiquement, comment puis-je le vérifier tout en sauvegardant le message?

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

Le code HTML de la boîte à méta ressemble à ceci.

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

Je ne suis pas très expérimenté dans le développement de plugins et je suis vraiment confus à ce sujet. Veuillez suggérer.

2
Konsole

Les nonces sont des numéros uniques à vie limitée à usage unique. Vous pouvez les cloner, mais le problème que vous verrez est qu'une fois renvoyés au serveur et validés, les autres clones deviendront invalides.

Vous avez plusieurs façons de gérer cela.

  1. Générez toutes vos boîtes sur le serveur et supprimez le Javascript.
  2. Utilisez Ajax pour demander un nouveau nonce pour chaque boîte clonée.
  3. Mon choix préféré, utilisez Ajax pour demander au serveur de créer le clone.

Dans les deux cas, votre nonce doit provenir du serveur. La façon dont WP gère cela (pour sa catégorie Métabox par exemple) consiste à générer le nom Nonce à partir du nom taxonomy. Vous pouvez éventuellement utiliser la valeur de publication ou le nom de l'image pour cela.

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

Cela exigerait également que vous stockiez le $name dans un champ caché de votre page.

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

À partir de votre Ajax, renvoyez le nom unique et le nonce au serveur, validez et renvoyez ce que vous voulez.

Quant à votre autre question "Le nonce est-il nécessaire?". En fait ça dépend. Je suggérerais, chaque fois que vous apportez des modifications à votre base de données à partir des données de formulaire, alors oui, elles sont nécessaires. Si vous ne récupérez que des données, alors non. Mais ils seront quand même utiles pour invalider des demandes qui peuvent avoir été marquées ou mises en cache quelque part. Je ne me souviens pas exactement, je pense que leur durée de vie est d'environ 12 heures.

4
Twifty