问题解答:今天在使用wp分类字段插件时候提示illegal offset url这种错误

Published
2022-10-15
浏览次数 :  25

我用的是 https://github.com/bainternet/Tax-Meta-Class 代码。

这种错误是因为以前代码写的php版本比较低引起的,我们不可能将PHP版本降低,所以我们要用另外的思路来解决问题。

他一开始的写法是这样:这个写法在5.5版本前完全没问题,但是5.6以后的版本因为安全原因,验证更加严格。

$std          = isset($field['std'])) ? $field['std'] : array('id' => '', 'url' => '');
    $name         = esc_attr( $field['id'] );
    $value        = isset($meta['id']) ? $meta : $std;
    //backwords capability
    
    if (!isset($value['url'])) {
    $value['url'] = ''; }

    if (!isset($value['id'])) {
    $value['id'] = '';
    }

错误提示的是$value[‘url’]这一行的url是非法偏移字符。 也就是$value这个数组里面是没有Url这个索引的,我们就一步步查找上去,上一步$value变量是什么。我们查找到上面$std这个变量输出的$field[‘std’]变量为0 , 所以这个结果就有点尴尬了,这个已经设置了isset() 了 所以这个变量输出的结果0 就不是后面的那个带url索引的数组了。

我们给这个变量多加一个验证, 验证不为0的状态,也就是用!empty() 来验证就好,来确保$std = isset($field[‘std’])) ? $field[‘std’] : array(‘id’ => ”, ‘url’ => ”); 这个输出的是后面的这个结果。

最终的代码是:

public function show_field_image( $field, $meta ) {
    $this->show_field_begin( $field, $meta );
    wp_enqueue_script('jquery-ui-sortable');
    wp_enqueue_media();
    $std          = isset($field['std']) && !empty($field['std']) ? $field['std'] : array('id' => '', 'url' => '');
    $name         = esc_attr( $field['id'] );
    $value        = isset($meta['id']) ? $meta : $std;
    //backwords capability
    
    if (!isset($value['url'])) {
    $value['url'] = ''; }

    if (!isset($value['id'])) {
    $value['id'] = '';
    }
    
    $has_image    = empty($value['url'])? false : true;
    $w            = isset($field['width'])? $field['width'] : 'auto';
    $h            = isset($field['height'])? $field['height'] : 'auto';
    $PreviewStyle = "style='width: $w; height: $h;". ( (!$has_image)? "display: none;'": "'");
    $id           = $field['id'];
    $multiple     = isset($field['multiple'])? $field['multiple'] : false;
    $multiple     = ($multiple)? "multiFile " : "";
    $value['url'] = isset($value['src'])? $value['src']: $value['url'];
    echo "<span class='simplePanelImagePreview'><img {$PreviewStyle} src='{$value['url']}'><br/></span>";
    echo "<input type='hidden' name='{$name}[id]' value='{$value['id']}'/>";
    echo "<input type='hidden' name='{$name}[url]' value='{$value['url']}'/>";
    if ($has_image)
    echo "<input class='{$multiple} button  simplePanelimageUploadclear' id='{$id}' value='".__('Remove Image')."' type='button'/>";
    else
    echo "<input class='{$multiple} button simplePanelimageUpload' id='{$id}' value='".__('Upload Image')."' type='button'/>";
    $this->show_field_end( $field, $meta );
  }

Top