你没有,或者至少没有以你期望的方式。如果问题中的代码按预期工作,它仍将犯下致命的性能错误,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 );