it-swarm.com.de

Optionswert mit update_option () aus Array löschen

Ich habe ein Benutzerprofilfeld, in dem der Benutzer Forenbeiträge per E-Mail abonniert. Dadurch wird die E-Mail-Adresse des Benutzers zu einem Array in wp-options hinzugefügt. Natürlich möchte ich, dass der Benutzer sich abmelden kann. In diesem Fall würde er ein Kontrollkästchen deaktivieren.

Hier ist, wie ich das versuche:

add_action( 'personal_options_update', 'my_save_extra_profile_fields' );
add_action( 'edit_user_profile_update', 'my_save_extra_profile_fields' );

function my_save_extra_profile_fields( $user_id ) {

if ( !current_user_can( 'edit_users', $user_id ) )
    return false;

if(!isset($_POST['subscribed'])){

    $useremail = get_userdata($user_id, 'user_email');
    $list = (array)get_option('mf_forum_subscribers_1');
    $key = array_search($useremail, $list);
    unset($list[$key]);

} else {

    update_option('mf_forum_subscribers_1', $_POST['subscribed']);
}
}

Da es nichts tut (und ich keine Fehler erhalte), gehe ich davon aus, dass ich das falsch gemacht habe. Ich habe nach einem anderen Hook gesucht und delete_option() gefunden, aber es wird nur ein Parameter verwendet und die gesamte Option gelöscht.

(Verzeihen Sie mir, wenn dies eine offensichtliche Frage ist) In einer normalen Form würde ich POST in GET ändern, damit ich die übermittelten Werte sehen kann. Wie kann ich das mit Hooks testen? (Das ist nicht die Frage, die beantwortet werden muss. Ich bin nur neugierig.)

Zusätzliche Information. Mir ist klar, dass ich wahrscheinlich die Funktionen, die die zusätzlichen Felder anzeigen, hätte einbeziehen sollen. Hier ist es :

add_action( 'show_user_profile', 'my_show_extra_profile_fields' );
add_action( 'edit_user_profile', 'my_show_extra_profile_fields' );

function my_show_extra_profile_fields( $user ) { ?>

<h3>Player information</h3>

<table class="form-table">

 <?php if(user_can( $user, 'edit_posts'))
    { ?>
    <tr>
        <th><label for="team-meta">Email Subscription to Main Forum</label></th>
        <td>

 <?php if(is_player_subscribed($user->data->user_email)){ ?>

                    <input type="checkbox" name="subscribe" value="<?php $user->data->user_email ?>" id="subscribed" checked> Automatic Forum e-mails<br>
            <?php

    } else { ?>
                <input type="checkbox" name="subscribe" value="<?php $user->data->user_email ?>" id="subscribed"> Automatic Forum e-mails<br>

            <?php } ?>
            <span class="description">Check to add subscription to General Forum email</span>

        </td>
    </tr>
 <?php } ?>
</table>
 <?php }
2
mantis

Es gibt einige Probleme mit Ihrem Code. Der folgende Code sollte Ihre Frage zum Löschen beantworten und die Abonnenten aus dem Options-Array entfernen. Ich habe den Code stark kommentiert, was erklären sollte, was ich getan habe:

Formular hinzufügen:

//add the forum subscription option as part of the personal options on the profile and user edit screen
add_action( 'personal_options', 'forum_subscr_to_profile_form' );
function forum_subscr_to_profile_form($user_obj) {
    //get user ID from user object
    $user_id = $user_obj->ID;
    //get option into variable
    $forum_subscr = get_option('forum_subscr');
    //check if user is in subscription array
    $fs_is = isset($forum_subscr[$user_id]);
    //depending on that setup variable for input value 
    $chkb_val = ( $fs_is == 1 ? 'false' : 'true' );
    //depending on that setup variable for checked staus
    $chkb_chk = ( $fs_is == 1 ? 'checked="checked"' : '' );
    ?>
        <!-- table row for the additional (small) header -->
        <tr class="additional-user-profile-opt">
            <th scope="row">
                <strong><?php _e('Additional Options'); ?></strong>
            </th>
            <td></td>
        </tr>
        <!-- table row for the option: title - checkbox - description -->
        <tr class="forum-subscribe">
            <th scope="row">
                <?php _e('Forum Subscription')?>
            </th>
            <td>
                <fieldset>
                    <legend class="screen-reader-text">
                        <span><?php _e('Forum Subscribe') ?></span>
                    </legend>
                    <label for="subscr_chkb">
                        <!-- choose a non-generic name to prevent conflicts, namespacing/prefixing it would be even better -->
                        <input id="subscr_chkb" type="checkbox" name="forum_subscrbd" value="<?php echo $chkb_val ?>" <?php echo $chkb_chk ?> />
                        <?php _e('Subscribe to Forum') ?>
                    </label><br />
                </fieldset>
            </td>
        </tr>
    <?php
}

Daten hinzufügen/entfernen:

//take care of adding and removing the user subscription from the array 
add_action( 'personal_options_update', 'forum_subscr_add_remove_user' );
add_action( 'edit_user_profile_update', 'forum_subscr_add_remove_user' );
function forum_subscr_add_remove_user($user_id) {
    //get user object
    $user_obj = get_userdata($user_id);
    //get option into variable
    $forum_subscr = get_option('forum_subscr');
    if ( !isset($_POST["forum_subscrbd"]) || $_POST["forum_subscrbd"] == false ) {
        //remove element from array by
        //first setting the value to null
        $forum_subscr[$user_id] = null;
        //and then filtering with array_filter
        $forum_subscr = array_filter($forum_subscr);
        update_option( 'forum_subscr', $forum_subscr );
    } else {
        //add element to array $user_id as key and $user_obj->user_email as value
        $forum_subscr[$user_id] = $user_obj->user_email;
        update_option( 'forum_subscr', $forum_subscr );
    }
}

Daten auf dem neuesten Stand halten:

//make sure the email in the subscription array gets updated when the email gets changed
add_action( 'show_user_profile', 'forum_subscr_keep_email_uptodate' );
add_action( 'edit_user_profile', 'forum_subscr_keep_email_uptodate' );
function forum_subscr_keep_email_uptodate($user_obj) {
    $user_obj = get_userdata($user_obj->ID);
    $forum_subscr = get_option('forum_subscr');
    //update the email for subscribers if the profile page and the subscription array email are not equal
    if ( isset($forum_subscr[$user_obj->ID]) && $user_obj->user_email != $forum_subscr[$user_obj->ID] ) {
        $forum_subscr[$user_obj->ID] = $user_obj->user_email;
        update_option( 'forum_subscr', $forum_subscr );
    }
}
1
Nicolai