Umgang mit komplexen Daten mit der Einstellungs-API

Ich hoffe, dass meine Frage nicht außerhalb des scopes dieser Website liegt und dass mir jemand dabei helfen kann.

Ich studiere derzeit die WP-Einstellungs-API und frage mich, wie ich einen Formularverwaltungsabschnitt erstellen kann, mit dem Sie Folgendes tun können:

  • Felder erstellen
  • Felder löschen
  • Ändern der Feldeigenschaften (Typ, Standardwert, usw.)
  • Reihenfolge der Felder ändern

Ich weiß, wie man das erwähnte Formular und alle functionen erstellt, ich bin nur nicht sicher über die richtige Art, das gewünschte Formularformat (Felder Reihenfolge, Feldeigenschaften) zu speichern.

Das erste, was mir in den Sinn kam, war versteckte Felder zu erstellen und ihre Werte mit Javascript zu ändern, aber irgendwas sagt mir, dass es eine bessere Lösung für diese Situation geben sollte.

Jeder Vorschlag wird geschätzt!

Solutions Collecting From Web of "Umgang mit komplexen Daten mit der Einstellungs-API"

Wenn Sie register_setting aufrufen, ist der dritte Parameter die Sanitiz Callback-function. Sie können die Datenbearbeitung, die Sie in dieser function benötigen, vornehmen, um die Benutzereingaben in das Format zu bringen, das Sie für Ihren Code benötigen. Nach der Datenvalidierung (Ganzzahlen sind Ganzzahlen, Textfelder bereinigen usw.) können Sie den aktuellen Optionswert abrufen und von dort entsprechend der Benutzereingabe hinzufügen oder löschen.

Sie können auch einige Manipulationen in JavaScript durchführen, bevor die Daten gesendet werden. Beachten Sie jedoch, dass JavaScript deaktiviert werden kann, sodass Sie mit zwei verschiedenen Arten von Eingaben arbeiten müssen. Daher ist dies normalerweise keine gute Idee.

Der folgende Code verwendet JavaScript auf der Seite zum Erstellen und Löschen von Elementen in einer Liste und fügt die gesamte Liste in eine Eingabe ein, wenn auf die Schaltfläche Speichern geklickt wird. Das Plugin ist abhängig vom Javascript für den Inhalt dieser Eingabe und speichert es im JSON-Format (keine Manipulation in PHP, nur in Javascript). Der Bereinigungsrückruf erstellt ein Array von Arrays, sodass der Benutzer mehrere benannte Listen speichern kann. Es ist nicht ganz dasselbe wie deine Frage, aber ähnlich und getestet.

 register_setting( 'example_group', 'example_option_name', 'example_settings_validation' ); function example_settings_defaults( $theme ) { // provide default option values if ( 'weaver-ii' == $theme ) $page = 'themes.php?page=WeaverII'; else if ( 'aspen' == $theme ) $page = 'themes.php?page=Aspen'; else $page = ''; $label = 'new'; $used = sanitize_key( $label ); $entry = array( 'color_class'=>'color', 'user_label'=>$label, 'last_modified'=>'', 'tie_list'=>json_encode( array() ) ); $new = array( 'theme_page'=>$page, 'last_used'=>$used, 'entries'=>array() ); $new['entries'][$used] = $entry; return $new; } function example_settings_validation( $input ) { // called by Settings API on a Save $clean = get_option( 'example_option_name', example_settings_defaults() ); $label = sanitize_text_field( $input['user_label'] ); if ( isset( $input['action_delete'] ) ) { // user clicked Delete list if ( isset( $input['user_label'] ) ) { $key = sanitize_key( $label ); unset( $clean['entries'][$key] ); if ( 0 == count( $clean['entries'] ) ) { $new = example_settings_defaults( 'xx'); $clean['entries'] = $new['entries']; $clean['last_used'] = $new['last_used']; } else if ( $key == $clean['last_used'] ) { // check if they deleted last used $keys = array_keys( $clean['entries'] ); $clean['last_used'] = $keys[0]; } add_settings_error('deleteID', 'action_delete', $label.__(' entry deleted.', 'xmpl'), 'updated'); } } if ( isset( $input['action_save'] ) ) { // user clicked Save $clean['theme_page'] = sanitize_text_field( $input['theme_page'] ); $entry = array(); $entry['color_class'] = sanitize_html_class( $input['color_class'] ); $entry['tie_list'] = sanitize_text_field( $input['tie_list'] ); $entry['last_modified'] = current_time( 'mysql' ); if ( empty( $label ) ) $label = 'new'; $entry['user_label'] = $label; $clean['last_used'] = sanitize_key( $label ); $clean['entries'][$clean['last_used']] = $entry; add_settings_error('saveID', 'action_save', $label. sprintf( _x(' entry saved at %s','MySQL timestamp', 'xmpl'), $entry['last_modified'] ), 'updated'); } return $clean; }