如何添加默认术语元以防止错误?

时间:2017-08-10 作者:Maarten Heideman

我将一些自定义字段添加到带有true或false的选择框的类别中。但如果术语meta不存在,则所选函数会给出一个错误:

注意:未定义索引:everyoneCompose in/Applications/MAMP/。。。在线22

我理解为什么,但如何设置默认值以防止此错误?我试图检查metadata\\u是否存在,并添加metadata一词,但这不起作用,请在此处检查我的代码:

    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\');

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

你没有,或者至少没有以你期望的方式。如果问题中的代码按预期工作,它仍将犯下致命的性能错误,database writes on the frontend.

因此,让我们看一下相关代码:

$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);
}
删除不必要的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\' =>
        array(
            \'everyoneCompose\' => true,
            \'restrictedGroup\' => true
        )
    );
}
这仍然会使代码在定义了设置但缺少键的情况下易受攻击,但在使用它们之前,应该检查值是否存在。

然而,它也指出了一个更深层次的问题

存储序列化数据这很糟糕,与其在term meta中存储具有2个值的数组,不如只存储2个term meta,没有理由不这样做:

$everyoneCompose = get_term_meta( $cat_id, \'everyoneComposer\', true );
$restrictedGroup = get_term_meta( $cat_id, \'restrictedGroup\', true );

结束

相关推荐

WP_SET_OBJECT_Terms和数组

我需要为大约2500篇文章添加一个类别,或者需要使用SQL查询,或者wp_set_object_terms 使用PHP。我在看wp_set_object_terms 因此,我可以添加一个类别,而不会影响当前分配的类别。下面使用的函数wp_set_object_terms\' (来自WordPress Codex)将数组中的一个或多个类别(在示例中为类别6和8)添加到ID为42的帖子(在示例中)。但我需要能够添加一个post id数组($object_id), 不是类别数组。根据https://codex.