Как добавить мета-термин по умолчанию, чтобы предотвратить ошибку?

Я добавляю несколько пользовательских полей в категорию с полями выбора со значениями true или false. Но если термин meta не существует, выбранная функция выдает ошибку:

Примечание: неопределенный индекс: EveryoneCompose в /Applications /MAMP /... в строке 22

Я понимаю, почему, но как установить значения по умолчанию, чтобы предотвратить эту ошибку? Я попытался проверить, существует ли metadata_exists и добавить термин meta, но это не работает, проверьте мой код здесь:

    function addSelectdFieldsToCat(){    $cat_id         = $_GET['tag_ID'];    if (metadata_exists('term', $cat_id, 'cat_settings' )) {        $catSettings    = get_term_meta($cat_id, 'cat_settings', false);    } else {        $defaultdata = array( 'cat_settings' =>            array(                'everyoneCompose' => true,                'restrictedGroup' => true            )        );        add_term_meta($cat_id, 'cat_settings', $defaultdata, false);    }    ?>    <tr class="form-field">        <th scope="row" valign="top"><label for="cat_page_title"><?php _e('Everyone can compose?'); ?></label></th>        <td>            <select name="cat_settings[everyoneCompose]">                <option value="1" <?php selected( $catSettings['everyoneCompose'], 1 ); ?>>true</option>                <option value="0" <?php selected( $catSettings['everyoneCompose'], 0 ); ?>>false, alleen admin</option>            </select>        </td>    </tr>    <tr class="form-field">        <th scope="row" valign="top"><label for="cat_page_title"><?php _e('Restricted category?'); ?></label></th>        <td>            <select name="cat_settings[restrictedGroup]">                <option value="1" <?php selected( $catSettings['restrictedGroup'], 1 ); ?>>true</option>                <option value="0" <?php selected( $catSettings['restrictedGroup'], 0 ); ?>>false</option>            </select>        </td>    </tr>    <?php}add_action ( 'edit_category_form_fields', 'addTitleFieldToCat');function saveCategoryFields() {    if ( isset( $_POST['cat_settings'] ) ) {        update_term_meta($_POST['tag_ID'], 'cat_settings', $_POST['cat_settings']);    }}add_action ( 'edited_category', 'saveCategoryFields');

Ответы и комментарии:

Вы не, или, по крайней мере, не так, как вы ожидаете. Если код в вопросе сработал так, как ожидалось, он все равно совершил бы смертельный грех производительности, пишет база данных на веб-интерфейсе.
Итак, давайте возьмем соответствующий код:
$ cat_id = $ _GET ['tag_ID'];
if (metadata_exists ('term', $ cat_id, 'cat_settings')) {
    $ catSettings = get_term_meta ($ cat_id, 'cat_settings', false);
} еще {
    $ defaultdata = array ('cat_settings' =>
        массив (
            'EveryoneCompose' => правда,
            'limitedGroup' => true
        )
    );
    add_term_meta ($ cat_id, 'cat_settings', $ defaultdata, false);
}

Удалите ненужный вызов metadata_exists:
$ cat_id = $ _GET ['tag_ID'];
$ catSettings = get_term_meta ($ cat_id, 'cat_settings', false);

И используйте значение ошибки, которое возвращается, если ничего не найдено:
$ cat_id = $ _GET ['tag_ID'];
$ catSettings = get_term_meta ($ cat_id, 'cat_settings', false);
if (empty ($ catSettings)) {
    $ catSettings = array ('cat_settings' =>
        массив (
            'EveryoneCompose' => правда,
            'limitedGroup' => true
        )
    );
}

Это по-прежнему оставляет код уязвимым для случаев, когда параметры определены, но ключи отсутствуют, однако вы должны проверить, существуют ли значения, прежде чем использовать их.
Однако это также указывает на более глубокую проблему
Хранение сериализованных данных
Это плохо, вместо того, чтобы хранить массив с 2 значениями в термине meta, просто хранить 2 термина meta, нет причины, по которой вы не могли бы сделать это:
$ everyoneCompose = get_term_meta ($ cat_id, 'EveryoneComposer', true);
$ limitedGroup = get_term_meta ($ cat_id, 'limitedGroup', true);
Создан 10-08-2017 02:51 Tom J Nowell♦31.9k44694