WordPress ACF从媒体库中删除图像

时间:2015-08-27 作者:benc

我正在尝试使用高级自定义字段的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

2 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

你很接近-有两件事:

  1. $field 是字段的数组表示形式,因此需要使用$field[\'name\'] 这是字段的名称
  2. get_field 除非将第三个参数设置为false,否则将格式化该值-我们需要的是ID,而不是post对象/URL(或为字段返回值配置的任何设置)
  3. 如果用户将图像替换为新图像,则代码不会删除该图像(仅在以下情况下处理$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 );

相关推荐