带有自定义字段的PHP警告

时间:2019-06-27 作者:Preston

看在上帝的份上,有人能帮我吗?

我的主题大约在一年前构建,我添加了自定义元框/字段。我创建了许多自定义分类法。但我不想把自定义分类法放在传统的复选框中。我希望它们在选择下拉菜单中作为选项。在我从4.9版更新到5.2版(最新更新)之前,一切都很好。

现在,当我尝试添加一个新的列表/帖子时,它不会保存数据并抛出多个PHP警告。

首先,我将显示警告,下面是我的代码。

****************编辑*****************

php error

以下是指向我的Github的链接,其中显示了我正在使用的文件:https://github.com/pcross1986/car-dealership

UPDATE - 6-28-2019 SCREENSHOT with errors

Screenshot of new errors

UPDATE - 6-28-2019 When trying to add a new post I also get this error

enter image description here

UPDATE 6.29.2019

看来我很接近了。我现在可以进入当前的帖子,在编辑和更新列表后,数据似乎正在保存。

现在的问题是,当我创建一个新列表时,它会给我这个错误。屏幕截图如下:

enter image description here

1 个回复
SO网友:Antti Koskinen

Update 29.6.19

我认为array_map() 错误实际上是由选择项的命名方式引起的。他们的名字是tax_input[fuel-type], 这可能会导致它们被传递到默认的分类法保存函数。由于每个select只传递一个值,并且我假设sax save处理程序需要一个数组array_map() 发出警告。

这也解释了为什么一些值没有保存。价值观不在$_POST[$valid_taxonomy], 但是$_POST[\'tax_input\'][$valid_taxonomy]meta\\u box.php:416)。我在编写循环示例时遗漏了这一点。

您可以尝试将选择的名称更改为name="tax_slug" 或者将名称更改为数组格式name="tax_input[fuel-type][]". foreach ( $valid_taxonomies as $valid_taxonomy ) 应开始使用前一个选项,而不必使用后一个选项。

尝试替换meta\\u框。php第59-60行wp_nonce_field( \'save_car_details_meta\', \'nonce_car_details\'); 第361-363行check_admin_referer( \'save_car_details_meta\', \'nonce_car_details\' );. 对鉴定元数据库及其保存功能做类似的事情。

<小时>

New answer

我快速浏览了一下您在GitHub上的代码,我认为这样应该可以让它工作。

将第372-518行替换为以下代码。具有具有有效键的助手数组,可以比较$_POST 反对分别循环元数据和术语数据,并相应地保存它们-元数据为post meta,将术语数据设置为post terms。

if ( \'revision\' === $post->post_type ) {
  return;
};

$valid_meta_keys = array(
  \'_vin\',
  \'_mileage\',
  \'_intcol\',
  \'_tot\',
  \'_nod\',
  \'_trim\',
  \'_price\',
);
foreach ( $valid_meta_keys as $valid_meta_key ) {
  $current_value = get_post_meta( $post->ID, $valid_meta_key, FALSE );
  $new_value = isset( $_POST[$valid_meta_key] ) ? $_POST[$valid_meta_key] : \'\';

  if ( ! $new_value && ! $current_value ) {
    delete_post_meta($post->ID, $valid_meta_key);
    continue;
  } else if ( ! $new_value ) {
    continue;
  }

  // If $value is an array, make it a CSV (unlikely)
  if ( is_array( $new_value ) ) {
    $new_value = implode(\',\', $new_value);    
  }

  // Returns meta_id if the meta doesn\'t exist, otherwise returns true on success and false on failure. It also returns false if the value submitted is the same as the value that is already in the database. 
  update_post_meta($post->ID, $valid_meta_key, sanitize_text_field( $new_value ) );
}

$valid_taxonomies = array(
  \'makes\',
  \'model_year\',
  \'body_type\',
  \'colors\',
  \'drivetrain\',
  \'transmissions\',
  \'fuel-type\',
  \'engine\',  
);
foreach ( $valid_taxonomies as $valid_taxonomy ) {
  $new_value = isset( $_POST[$valid_taxonomy] ) ? intval( $_POST[$valid_taxonomy] ) : NULL;
  // Replace previous terms or clear with NULL $new_value
  wp_set_object_terms( $post->ID, $new_value, $valid_taxonomy, false );
}
用以下代码替换第597-610行。这里不需要循环,因为只有一个元键。

$customer_name = isset( $_POST[\'_customer\'] ) ? $_POST[\'_customer\']: \'\';
if ( get_post_meta( $post->ID, \'_customer\', FALSE ) ) {
  update_post_meta($post->ID, \'_customer\', sanitize_text_field( $customer_name ) );
} else {
  delete_post_meta($post->ID, \'_customer\');
}
<小时>

First answer

正如Jacob Peattie在评论中指出的那样,您的问题有相当多的代码,因此很难进行审查

但是根据您提供的屏幕截图,您应该深入查看PHP警告中提到的主题文件,并在相关行中添加一些保护条款。这里有一些一般的例子,

未定义索引

// key is set in array and the value is not empty
if ( ! empty( $array[\'some_key\'] ) ) {
  // some code
}

// key is set in array, but value can be empty
if ( isset( $array[\'some_key\'] ) ) {
  // some code
}
参数应为数组或为foreach提供的无效参数

// make sure the variable is array
if ( is_array( $something ) ) {
  // foreach loops
  // array_maps
}
未定义变量

// variable exists and is different than NULL
if ( isset( $variable ) ) {
  // some code
}

// variable exists and value equals FALSE
if ( ! empty( $variable ) ) {
  // some code
}
确实为添加回退ifs与elses、 如果需要。E、 g。

将键添加到具有空值或某些默认值的数组

相关推荐

在Metabox中输入选择选项更改内容

我正在为我的插件在自定义Metabox中创建一个“输入选择选项”,我不擅长PHP;不知道如何保存用户“输入选择选项”。工作非常简单的PHP。public function zon_featuress_boxx( $post ) { wp_nonce_field( \'zonpackk_testimonial\', \'zonpackk_testimonial_nonce\' ); $data = get_post_meta( $post->ID, \'_zon