我正在尝试使用高级自定义字段的update\\u value filter挂钩编写一个函数,当用户从字段中删除图像时,它也将从WP的媒体库中删除。到目前为止,我还没有成功,我犯了很多错误。我需要检查字段的值是否为空,然后获取之前的值(图像)找到ID并删除附件?有什么想法吗?
//Delete image from acf field
function my_acf_update_value( $value, $post_id, $field )
{
if (empty($value)){
$var = get_field($field, $post_id);
$varid = $var[\'id\'];
wp_delete_attachment( $var, true );
}
// do something else to the $post object via the $post_id
return $value;
}
add_filter(\'acf/update_value/type=image\', \'my_acf_update_value\', 10, 3);
错误:
警告:isset中的偏移类型非法,或/xxx/xxx/xxx/xxx/xxxxxx/xxxxxx/xxx中为空。xxxxxxxx。com/html/wp-includes/meta。php在线484
警告:isset中的偏移类型非法,或/xxx/xxx/xxx/xxx/xxxxxx/xxxxxx/xxx中为空。xxxxxxxx。com/html/wp-includes/meta。php在线484
警告:无法修改标题信息-标题已由(输出开始于/xxx/xxx/xxx/xxx/xxxxxx/xxxxxxx/xxxxxxx/xxxxxxx.xxxxxxx.com/html/wp includes/meta.php:484)在/xxx/xxx/xxx/xxxxxx/xxx中发送。xxxxxxxx。com/html/wp-admin/post。php在线233
警告:无法修改标题信息-标题已由(输出开始于/xxx/xxx/xxx/xxx/xxxxxx/xxxxxxx/xxxxxxx/xxxxxxx.xxxxxxx.com/html/wp includes/meta.php:484)在/xxx/xxx/xxx/xxxxxx/xxx中发送。xxxxxxxx。com/html/wp包含/可插入。php在线1179
最合适的回答,由SO网友:TheDeadMedic 整理而成
你很接近-有两件事:
$field
是字段的数组表示形式,因此需要使用$field[\'name\']
这是字段的名称get_field
除非将第三个参数设置为false,否则将格式化该值-我们需要的是ID,而不是post对象/URL(或为字段返回值配置的任何设置)- 如果用户将图像替换为新图像,则代码不会删除该图像(仅在以下情况下处理
$value
是空的)
此处对其进行了修订:
function wpse_83587_delete_image( $value, $post_id, $field ) {
$old_value = get_field( $field[\'name\'], $post_id, false /* Don\'t format the value, we want the raw ID */ );
if ( $old_value && ( int ) $old_value !== ( int ) $value )
wp_delete_attachment( $old_value, true );
return $value;
}
add_filter( \'acf/update_value/type=image\', \'wpse_83587_delete_image\', 10, 3 );
SO网友:fngrl
如果有人需要转发器字段使用该选项,那么很遗憾,上述解决方案无法工作,因为当行号更改时,新值中的字段名称也会更改。
对于中继器,我们必须在调用中继器更新的挂钩时更早地捕获文件字段。
然后,我们将旧的行与新行进行比较,对于我们在一行中找到的每个文件字段,检查该文件是否仍存在于新行中。
function pg_update_acf_repeater_field( $new_value, $post_id, $field ) {
$old_value = get_field( $field[\'name\'], $post_id, false );
// If we changed the repeater fields
if ( $old_value && ($old_value != $new_value) ) {
// Go through each row of the old values
foreach ( $old_value as $row ) {
// Go through each field of the row and check whether it is a file field
foreach ( $row as $field_key => $field_value ) {
// We get the field details of our current field
$field_data = array_filter( $field[\'sub_fields\'], function( $el ) use ($field_key) {
return $el[\'key\'] == $field_key;
});
// If we find a file, we check whether it is still present in the new repeater rows as well
if ( $field_data && in_array( array_values($field_data)[0][\'type\'], array(\'image\', \'file\')) ) {
$found = false;
if ( $new_value ) {
foreach ( $new_value as $row ) {
if ( $row[$field_key] == $field_value ) $found = true;
}
}
if ( !$found ) {
wp_delete_attachment( $field_value );
}
}
}
}
}
return $new_value;
}
add_filter( \'acf/update_value/type=repeater\', \'pg_update_acf_repeater_field\', 10, 3 );