Je développe un widget wordpress et dois stocker certaines valeurs de configuration utilisateur. C'est pourquoi j'utilise wordpress update_option et get_option. Je suis nouveau dans le développement de widgets.
J'ai quelques options de configuration pour le widget auquel j'ai besoin d'accéder depuis une fonction php appelée via ajax, c'est pourquoi j'utilise l'API Options (existe-t-il un autre moyen?)
Le code que j'ai est le suivant (d'abord, les fonctions de widget, puis ma fonction de traitement ajax):
public function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance = array();
$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
$instance['api_key'] = ( ! empty ($new_instance['api_key']) ) ? strip_tags ($new_instance['api_key']) : '';
$instance['forum_key'] = ( ! empty ($new_instance['forum_key']) ) ? strip_tags ($new_instance['forum_key']) : '';
$instance['limit'] = ( ! empty ($new_instance['limit']) ) ? strip_tags ($new_instance['limit']) : '';
return $instance;
} // end widget
public function form( $instance ) {
$instance = wp_parse_args(
(array) $instance
);
$title = ( isset ($instance['title'] ) ) ? esc_attr($instance['title']) : __( 'New title', 'eedee-dq-widget' );
$api_key = ( isset ($instance['api_key'] ) ) ? esc_attr($instance['api_key']) : '';
$forum_key = ( isset ( $instance ['forum_key'] ) ) ? esc_attr($instance['forum_key']) : '' ;
$limit = ( isset ( $instance ['limit'] ) ) ? esc_attr($instance['limit']) : 5 ;
// Display the admin form
include( plugin_dir_path(__FILE__) . '/views/admin.php' );
} // end form
public function handle_ajax_post() {
check_ajax_referer( 'my_nonce', 'security' );
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$error = false;
if ($error == false) {
$options = get_option('widget_my_comment_widget');
...
tout fonctionne (enregistrement des valeurs de formulaire, appel de la fonction ajax avec php), le seul problème est que la ligne
$options = get_option('widget_my_comment_widget');
retourne un tableau comme celui-ci
$options = array[3]
$options[3] = array[4]
$options[3]['title'] = (string) discussion
$options[3]['api_key'] = (string) xxx
$options[3]['forum_key'] = (string) zzz
$options[3]['limit'] = (string) 5
$options[4] = array[4]
$options[4]['title'] = (string) New title
$options[4]['api_key'] = (string) xxx
$options[4]['forum_key'] = (string) yyy
$options[4]['limit'] = (string) 5
$options['_multiwidget'] = (int) 1
il renvoie donc plusieurs configurations de widget (pourquoi? Je n'ai qu'une seule instance du widget dans ma barre latérale unique? Parce que je l'ai dans plusieurs thèmes?). Comment puis-je m'assurer d'obtenir le bon identifiant des options de mon choix ou de s'assurer qu'il n'existe qu'un seul jeu d'options sans clé d'identification?
Edit Après avoir désactivé le plug-in, supprimez l'entrée de la base de données et activez-le à nouveau, en ajoutant un widget à nouveau, les options $ ressemblent à ceci:
$options = array[2]
$options[2] = array[4]
$options[2]['title'] = (string) discourse
$options[2]['api_key'] = (string) xxx
$options[2]['forum_key'] = (string) highcut
$options[2]['limit'] = (string) 5
$options['_multiwidget'] = (int) 1
donc toujours il y a cet index, j'ai googlé et trouvé qu'il est lié au paramètre _multiwidget, mais pourquoi est-il là?
Editer 2 Mon constructeur est
parent::__construct(
'my_comment_widget',
__( 'my Comment Widget', 'eedee-my-widget' ),
array(
'description' => __( 'Displays recent and popular comments ', 'eedee-my-widget' ), )
);
donc je n'utilise pas d'espaces de nommage (ou suis-je à contrecoeur?) comme indiqué dans cette partie de la documentation officielle, j'ai trouvé googler multi-widget.
J'ai trouvé la réponse.
Multiwidget est une nouvelle fonctionnalité intéressante de la nouvelle API de widgets de wordpress. Pourtant, il existe peu de documentation sur son utilisation.
$options = get_option( 'your_option_id' );
if( isset($options) && isset($options[$this->number])) {
//$this->number returns the unique widget id that corresponds to the database index
$instance_options = $options[$this->number];
}
//now use $instance_options['setting']