2016-05-03 15 views
0

Total ratlos. Ich habe ein Kontrollkästchen auf der Benutzerprofilseite, aber es verweigert die Aktualisierung. Es ist nicht einmal ein Array-Sollwert oder irgendetwas, nur setzt nie ... Scheint wie keine Daten an den Postwert übergeben wird ...Wordpress Checkbox wird nie auf Profilseite aktualisiert

per @RST aktualisiert und nun per @ simon-Pollard

// This will show below the color scheme and above username field 
add_action('profile_personal_options', 'extra_profile_fields'); 
add_action('personal_options_update', 'update_field_value'); 
add_action('edit_user_profile_update', 'update_field_value'); 

function extra_profile_fields($user) { 
    // get the value of a single meta key 
    $user_id = $user->ID; 
    echo "user id: " . $user_id . "<br/>"; 
    $meta_value = get_user_meta($user->ID, 'emailPrefs', true); // $user contains WP_User object 
    // do something with it. 
    echo "checked value: " . $meta_value. "<br/>"; 
    ?> 
    <h2>Email Settings</h2> 
    <table class="form-table"> 
    <th scope="row" id="lbl-subtitle" for="email-settings">Email on Timer Reset</th> 
    <td><fieldset> 
<form method='post' action="profile.php"> 

    <input type="checkbox" id="email-settings" name='email-settings' 
<?php if ($meta_value == '1'){ echo 'checked'; } ?> value ="<?php echo $meta_value?>" /> 

    </form> 
      <?php submit_button(); ?> 
    </td> 
    </fieldset> 
    </table> 
    <?php 


} 

function update_field_value($user) { 

$user_id =$user->ID; 

    if (isset($_POST['email-settings']) && $_POST['email-settings'] == 'on') { 
     update_user_meta($user_id, 'emailPrefs', '1'); 
    } else { 
     update_user_meta($user_id, 'emailPrefs', NULL); 
    } 


} 
+0

Setzen Sie den Update-Befehl in eine separate Funktion und verwenden Sie die \t add_action ('personal_options_update', 'your_update_function'); \t add_action ('edit_user_profile_update', 'your_update_function'); – RST

+0

Versuchen Sie, 'if (! Empty ($ _ POST [' E-Mail-Einstellungen '])' zu ... 'if (isset ($ _ POST ['E-Mail-Einstellungen']) && $ _POST ['E-Mail-Einstellungen'] == 'on') 'Ich denke, im Moment stellen Sie es immer auf '' und btw sollten Sie es auf null setzen :) nicht '' –

+0

@SimonPollard Ich versuchte issset zunächst und las, dass es _always_ immer mit wahr bewerten würde ein Kontrollkästchenwert Nichts aktualisiert, so dass meine Funktion nicht aufgerufen wird – Frankenmint

Antwort

0

Dank @Simon. Mit seiner Hilfe sah ich, dass das Objekt $user nicht auf diesem Update-Hook zugänglich war, was bedeutet, dass user_meta nie aktualisiert wurde. Um dies zu umgehen, habe ich ein verstecktes Formularfeld erstellt, um meine Benutzer-ID zu speichern, so dass sie als Post-Variable verfügbar ist.

Hier ist der finale Code:

// This will show below the color scheme and above username field 
add_action('profile_personal_options', 'extra_profile_fields'); 
add_action('personal_options_update', 'update_field_value'); 
add_action('edit_user_profile_update', 'update_field_value'); 

function extra_profile_fields($user) { 
    // get the value of a single meta key 
    $user_id = $user->ID; 
    echo "user id: " . $user_id . "<br/>"; 
    $meta_value = get_user_meta($user->ID, 'emailPrefs', true); // $user contains WP_User object 
    // do something with it. 
    echo "checked value: " . $meta_value. "<br/>"; 
    ?> 
    <h2>Email Settings</h2> 
    <table class="form-table"> 
    <th scope="row" id="lbl-subtitle" for="email-settings">Email on Timer Reset</th> 
    <td><fieldset> 
<form method='post' action="profile.php"> 
<input type='hidden' name="user_id" value="<?php echo $user_id ?>" /> 
    <input type="checkbox" id="email-settings" name='email-settings' 
<?php if ($meta_value == '1'){ echo 'checked'; } ?> /> 

    </form> 
      <?php submit_button(); ?> 
    </td> 
    </fieldset> 
    </table> 
    <?php 


} 

function update_field_value($user_id) { 

$user_id = $_POST['user_id']; 
// echo $user_id; 

// echo $_POST['email-settings']; 

// wp_die(); 

    if (isset($_POST['email-settings'], $_POST['user_id']) && $_POST['email-settings'] == 'on') { 
     update_user_meta($user_id, 'emailPrefs', '1'); 
    } else { 
     update_user_meta($user_id, 'emailPrefs', NULL); 
    } 


} 

Weggehen in dem Abschnitt kommentierte, so zukünftige Leser dies selbst überprüfen können.

+0

Froh, dass es für Sie geklappt hat - ich würde ein Isset um das user_id-Bit auch für eine bessere Validierung usw. wickeln ... Ich kann Ihre Antwort bearbeiten, wenn Sie Ihnen zeigen wollen, was ich meine –

+0

Ich verstehe, was Sie sagen, ich Mach weiter und mach das auch :) – Frankenmint

Verwandte Themen