Frontend Form Checkbox Update ACF Feld

Ich habe ein Frontend-Formular mit Text, Select und Checkbox gibt den Text ein und wählt update und funktioniert gut, mit update_post_meta () aber die Checkboxen werden nicht aktualisiert. Da sie in einem serialisierten Array gespeichert sind, muss ich eine andere function verwenden oder sie einfach anders einrichten?

update_post_meta($post_id, 'appliances', esc_attr(strip_tags($_POST['customMetaAppliances[]']))); 

Hier ist der Code, um die Checkboxen auch auf dem Frontend auszugeben, was perfekt funktioniert, nur dass die aktivierten Optionen nicht in der database gespeichert werden.

  $val){ if(is_array($allCheckbox) && in_array($val, $allCheckbox)){ $checked = 'checked = "checked"'; //$enable = ''; } else { $checked = ''; //$enable = 'disabled=""'; } ?> 
  • <input type="checkbox" name="customMetaAppliances[]" id="customMetaAppliances" value="" />
  • <?php $count++; if ($count == 3) { echo '
      '; $count = 0; } } ?>

    Wenn die Zeile in der database angezeigt wird, wird diese übergeben, so dass das Array der Checkboxen ignoriert wird?

    Bildbeschreibung hier eingeben

    AKTUALISIEREN:

    Bildbeschreibung hier eingeben

    Das ist also sinnvoll, aber es scheint, dass das Array von name = “customMetaAppliances []” nicht von den Checkboxen übergeben wird? Was denkt ihr?

    Solutions Collecting From Web of "Frontend Form Checkbox Update ACF Feld"

    Um mit ACF kompatibel zu sein, sollten Sie zuerst herausfinden, wie ACF Checkbox-Werte in der database speichert. Wie ich jetzt das serialisierte Array bin. Wenn wir wissen, dass wir unsere Frontend-Checkboxen auf die gleiche Weise speichern müssen. Die gute Nachricht ist, dass Sie nur Array an update_post_meta und WordPress kümmert sich um die Serialisierung.

    Das Problem mit Ihrem Code besteht darin, dass Sie wahrscheinlich kein Array mit Checkbox-Werten übergeben. Sie sollten diesen Teil untersuchen: esc_attr(strip_tags($_POST['customMetaAppliances[]'])) .

    Zwei Dinge, die mich hier stören:

    • esc_attr functionen esc_attr und strip_tags erwarten String als Argument und nicht als Array, das unerwartete Ergebnisse liefern kann
    • Wenn Sie ein Array von Checkboxen aus der Post-Anfrage erhalten möchten, sollten Sie den Feldnamen ohne eckige Klammern customMetaAppliances

    Ich denke, Sie können den Ersatzteil mit Code ersetzen:

     $customMetaAppliances = filter_input( INPUT_POST, 'customMetaAppliances', FILTER_SANITIZE_STRING, FILTER_REQUIRE_ARRAY ); update_field( 'customMetaAppliances', $customMetaAppliances, $post_id ); 

    Persönlich, wenn ich ACF installiert habe, verwende ich update_field anstelle von update_post_meta .

    Ich habe eine voll funktionsfähige class erstellt, die das Formular auf dem Frontend nach dem Post-Inhalt anzeigt und Werte speichert, um ACF-Felder beim Senden zu posten.

     class WPSE_287946_Form { /** * Class constructor */ public function __construct() { $this->define_hooks(); } public function save_form() { if( isset( $_POST['save'] ) ) { // Submit button $post_id = filter_input( INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT ); $name = filter_input( INPUT_POST, 'name', FILTER_SANITIZE_STRING ); $color = filter_input( INPUT_POST, 'color', FILTER_SANITIZE_STRING ); $accessories = filter_input( INPUT_POST, 'accessories', FILTER_SANITIZE_STRING, FILTER_REQUIRE_ARRAY ); update_field( 'name', $name, $post_id ); update_field( 'color', $color, $post_id ); update_field( 'accessories', $accessories, $post_id ); // Redirect user because POST request on single post page will trigger 404 page. wp_redirect( get_permalink( $post_id ) ); } } /** * Display form */ public function display_form( $content ) { $name = get_field( 'name' ); $color = get_field( 'color' ); $accessories = get_field( 'accessories' ); ob_start(); ?> 

    < ?php $this->display_text( 'name', 'Name', $name ); ?>

    < ?php $this->display_select( 'color', 'Color', $this->get_available_colors(), $color ); ?>

    < ?php $this->display_checkboxes( 'accessories', 'Accessories', $this->get_available_accessories(), $accessories ); ?>

    < ?php $output = ob_get_contents(); ob_end_clean(); return $content . $output; } /** * Display text field */ private function display_text( $name, $label, $value = '' ) { ?> < ?php } /** * Display select field */ private function display_select( $name, $label, $options, $value = '' ) { ?> < ?php } /** * Display options */ private function display_options( $options, $value ) { foreach( $options as $option_value => $option_label ): $selected = ( $option_value === $value ) ? ' selected' : ''; ?> < ?php endforeach; } /** * Display checkboxes field */ private function display_checkboxes( $name, $label, $options, $values = array() ) { $name .= '[]'; ?> < ?php foreach ( $options as $option_value => $option_label ): $this->display_checkbox( $name, $option_label, $option_value, $values ); endforeach; } /** * Display single checkbox field */ private function display_checkbox( $name, $label, $available_value, $values = array() ) { $checked = ( in_array($available_value, $values) ) ? ' checked' : ''; ?> < ?php } /** * Get available colors */ private function get_available_colors() { return array( 'red' => 'Red', 'blue' => 'Blue', 'green' => 'Green', ); } /** * Get available accessories */ private function get_available_accessories() { return array( 'case' => 'Case', 'tempered_glass' => 'Tempered glass', 'headphones' => 'Headphones', ); } /** * Define hooks related to plugin */ private function define_hooks() { /** * Add action to save form */ add_action( 'wp', array( $this, 'save_form' ) ); /** * Add filter to display form */ add_filter( 'the_content', array( $this, 'display_form' ) ); } } new WPSE_287946_Form();

    Sollte der Name des Kontrollkästchens nicht name = “customMetaAppliances []” lauten? Auf diese Weise erhalten Sie ein Array von ihnen in $ _POST. Jetzt geben Sie nur den Wert des letzten Formulars ein, wenn es nicht aktiviert ist, ist es leer und nicht gespeichert.