J'essaie d'ajouter un champ de formulaire à un widget WordPress de manière dynamique. Ainsi, si l'utilisateur souhaite ajouter une autre date à un événement, il peut cliquer sur un bouton pour obtenir plus de champs.
La question est: Comment enregistrer les champs de saisie nouvellement créés dans ma base de données? Dois-je écrire une fonction de mise à jour personnalisée? Des conseils?
Voici à quoi ressemble le widget:
Ceci est mon code php pour le widget (jusqu'à présent):
class Spillelister extends WP_Widget {
public function Spillelister() {
$widget_options = array (
'classname' => 'spillelister-widget',
'description' => 'Widget for å illustrere spillelister.');
parent::WP_Widget('spillelister_widget', 'Spilleplan', $widget_options);
}
// The actual widget user interface
public function widget($args, $instance) {
extract( $args, EXTR_SKIP);
$title = ( $instance['title'] ) ? $instance['title'] : 'Spilleplan';
$body = ( $instance['body'] ) ? $instance['body'] : 'Ingen flere forestillinger';
?>
<?php echo $before_widget; ?>
<?php echo $before_title . $title . $after_title; ?>
<p><?php echo $body; ?></p>
<?php
}
public function update() {
}
public function form() {
?>
<div class="date_stamp">
<p>
<label>Dato</label> <input type="text" class="datepicker">
<br>
<label>Tid</label> <input type="text">
<span class="remove">Remove</span>
</p>
</div>
<p>
<span class="add">Add fields</span>
</p>
<?php
}
}
function spillelister_init() {
register_widget('Spillelister');
}
add_action('widgets_init', 'Spillelister_init');
Tous les conseils, astuces ou réponses sont les bienvenus. :)
Question interessante!
Je n'ai jamais vu de champs reproductibles utilisés dans les widgets. Donner une réponse complète nécessiterait trop de travail/temps, je vous donnerai donc des liens vers les ressources que je connais et j'espère que vous réaliserez ce travail et partagerez la solution avec nous;)
Tous ces exemples concernent les méta-boîtes, vous devrez copier les scripts jQuery et adapter le post_meta
au cas des widgets.
Créez plus de méta-boîtes selon vos besoins - WPSE Q & A
Champs personnalisés pouvant être répétés dans un Metabox - Gist
/** * Repeatable Custom Fields in a Metabox * Author: Helen Hou-Sandi * * From a bespoke system, so currently not modular - will fix soon * Note that this particular metadata is saved as one multidimensional array (serialized) */
Champs personnalisés pouvant être répétés dans une Metabox - Autre exemple de Gist, pas de description. Celui-ci est assez intéressant car il a le code pour trier les champs.
Voici un exemple de widget dynamique qui affiche deux champs (image-id et url). si vous entrez une image-id et que vous appuyez sur "update", deux nouveaux champs sont ajoutés. Je le construis pour créer un slider lisse avec des images et des URL liées.
<?php
class imp_image_slider extends WP_Widget
{
/**
* imp_image_slider constructor.
*/
public function __construct()
{
parent::__construct(false, $name = "Impulse Image Slider", array("description" => "Creates Slick Image Slider"));
}
/**
* @see WP_Widget::widget
*
* @param array $args
* @param array $instance
*/
public function widget($args, $instance)
{
// render widget in frontend
}
/**
* @see WP_Widget::update
*
* @param array $newInstance
* @param array $oldInstance
*
* @return array
*/
public function update($newInstance, $oldInstance)
{
$instance = $oldInstance;
$instance['images'] = array();
$instance['urls'] = array();
if (isset($newInstance['images'])) {
foreach ($newInstance['images'] as $key => $value) {
if (!empty(trim($value))) {
$instance['images'][$key] = $value;
$instance['urls'][$key] = $newInstance['urls'][$key];
}
}
}
return $instance;
}
/**
* @see WP_Widget::form
*
* @param array $instance
*/
public function form($instance)
{
$images = isset($instance['images']) ? $instance['images'] : array();
$urls = isset($instance['urls']) ? $instance['urls'] : array();
$images[] = '';
$form = '';
foreach ($images as $idx => $value) {
$image = isset($images[$idx]) ? $images[$idx] : '';
$url = isset($urls[$idx]) ? $urls[$idx] : '';
$form .= '<p>'
. '<label>Slides:</label>'
. sprintf(
'<input type="text" name="%1$s[%2$s]" value="%3$s" class="widefat" placeholder="Image ID">',
$this->get_field_name('images'),
$idx,
esc_attr($image))
. '</p>'
. '<p>'
. sprintf(
'<input type="text" name="%1$s[%2$s]" value="%3$s" class="widefat" placeholder="Url">',
$this->get_field_name('urls'),
$idx,
esc_attr($url))
. '</p>';
}
echo $form;
}
}
add_action('widgets_init', create_function('', 'return register_widget("imp_image_slider");'));
?>