Поле обновления ACF, связанное с пользователем

Я создал несколько настраиваемых полей на странице профиля пользователя в WordPress.

Мне удалось создать интерфейсный редактор, чтобы пользователь мог изменить некоторые настройки электронной почты:

<?php if( isset($_POST['preferences']) ) :

    update_field('planner-reminders', $_POST['planner-reminders'], 'user_'.$user_id.'');
    update_field('event-suggestions', $_POST['event-suggestions'], 'user_'.$user_id.'');
    update_field('woa-updates', $_POST['woa-updates'], 'user_'.$user_id.'');

    echo '<p class="success">E-Mail Prefereneces Updated<p>';

endif; ?>

<form action="<?php the_permalink(); ?>" method="POST" class="user-email-settings">

    <!-- planner reminders -->
    <?php 
        $field = get_field('planner-reminders', 'user_'.$user_id.'');
        if( $field == true ) {
            $field = '1';
            $checked = true;
        }
    ?>
    <input type="checkbox" id="planner-reminders" name="planner-reminders" class="pref"
    value="<?php echo $field; ?>" <?php if($checked) :?> checked <?php endif;?> />
    <label for="planner-reminders">I don't want to revieve reminders about events I've added to my planner.</label>
    <?php $checked = false; ?>


    <!-- event suggestions from WOA -->
    <?php 
        $field = get_field('event-suggestions', 'user_'.$user_id.'');
        if( $field == true ) {
            $field = '1';
            $checked = true;
        }
    ?>
    <input type="checkbox" id="event-suggestions" name="event-suggestions" class="pref"
    value="<?php echo $field; ?>" <?php if($checked) :?> checked <?php endif;?> />
    <label for="event-suggestions">I don't want to recieve suggestions about events I may be interested in.</label>
    <?php $checked = false; ?>



    <!-- updates from WOA -->
    <?php 
        $field = get_field('woa-updates', 'user_'.$user_id.'');
        if( $field == true ) {
            $field = '1';
            $checked = true;
        }
    ?>
    <input type="checkbox" id="woa-updates" name="woa-updates" class="pref"
    value="<?php echo $field; ?>" <?php if($checked) :?> checked <?php endif;?> />
    <label for="woa-updates">I don't want to recieve e-mail updates from What's On Advisor.</label>
    <?php $checked = false; ?>

    <input type="submit" value="Save Preferences" name="preferences" id="preferences" />

</form>

Теперь, кажется, это действительно работает. Если я обновляю флажок, он отображается и проверяется / снимается, как и должно быть, и он правильно отображается в интерфейсе и бэкенде.

Но когда я пытаюсь запросить этот параметр с помощью wp_query, чтобы фактически отправить электронные письма тем, кто не отказался, это немного глючит.

Если пользователь отказывается, а затем снова соглашается, wp_query их не подбирает. Он подбирает их только тогда, когда я захожу в область wp-admin и обновляю их профиль пользователя. На самом деле мне не нужно ничего менять, просто откройте пользователя и нажмите «Обновить».

Вот wp_query на всякий случай:

<?php $args = array(
    'role' => 'Subscriber',
    'meta_key' => 'planner-reminders',
    'meta_value' => '0',
    'meta_compare' => '=='
); ?>

<?php $user_query = new WP_User_Query( $args ); ?>

<?php if ( ! empty( $user_query->results ) ) : ?>

etc. etc.

Любые идеи, как я могу заставить это работать правильно? Есть ли функция для имитации нажатия кнопки «Обновить пользователя» в wp-admin?

Спасибо.


person lukeseager    schedule 26.05.2014    source источник
comment
Я думал, что update_field работает для метатаблицы сообщений, так почему вы используете user_1 в качестве идентификатора сообщения? Я предполагаю, что в этом случае вместо этого будет использоваться текущий идентификатор сообщения?   -  person birgire    schedule 30.05.2014
comment
Нет, вы можете передать много вещей вместо идентификатора сообщения. Это поле добавляется в профиль каждого пользователя, поэтому вам нужно указать user_$user_id, чтобы он знал, какого пользователя ему нужно обновить.   -  person lukeseager    schedule 31.05.2014
comment
хорошо, спасибо, что прояснил это ;-)   -  person birgire    schedule 31.05.2014


Ответы (1)


Когда пользователь отказывается, значение $field будет пустым, и, следовательно, атрибут value флажков будет пустым. Я не тестировал его полностью, но это может привести к неожиданному поведению в вашей настройке. Когда форма с неотмеченным флажком отправляется через POST-запрос, имя флажка не будет установлено в массиве $_POST, поэтому в этом случае вы должны установить value-атрибут флажков в «1», поэтому он правильно сохраняется через update_field.

Не могли бы вы попробовать изменить значения флажка в приведенном выше коде на «1» для элементов ввода флажка? Это будет value="1" вместо value="<?php echo $field; ?>".

Чтобы предотвратить генерацию уведомлений PHP для несуществующих ключей массива, я бы посоветовал также изменить update_field('planner-reminders', $_POST['planner-reminders'], 'user_'.$user_id.''); на update_field('planner-reminders', empty( $_POST['planner-reminders'] ) ? '0' : '1', 'user_'.$user_id.'');.

person engelen    schedule 29.05.2014
comment
Большой! На самом деле мне нужно было только изменить код на update_field('planner-reminders', empty( $_POST['planner-reminders'] ) ? '0' : '1', 'user_'.$user_id.'');, как было предложено в конце. Но это сработало очарование! Спасибо! Даст награду, когда это позволит мне отправить его :) - person lukeseager; 30.05.2014