web-dev-qa-db-fra.com

Déplacer un fichier d'un répertoire à un autre

J'ai cette fonction:

function attachment_selectbox_edit($form_fields, $post) {

$select_options = array(
    "no" => "No",
    "yes" => "Yes"
);

// get the current value of our custom field
$current_value = get_post_meta($post->ID, "_my_select", true);

// build the html for our select box
$mySelectBoxHtml = "<select name='attachments[{$post->ID}][my_select]' id='attachments[{$post->ID}][my_select]'>";
foreach($select_options as $value => $text){

    // if this value is the current_value we'll mark it selected
    $selected = ($current_value == $value) ? ' selected ' : '';

    // escape value for single quotes so they won't break the html
    $value = addcslashes( $value, "'");

    $mySelectBoxHtml .= "<option value='{$value}' {$selected}>{$text}</option>";
}
$mySelectBoxHtml .= "</select>";

// add our custom select box to the form_fields
$form_fields["my_select"]["label"] = __("Move the file?");
$form_fields["my_select"]["input"] = "html";
$form_fields["my_select"]["html"] = $mySelectBoxHtml;

return $form_fields;
}
add_filter("attachment_fields_to_edit", "attachment_selectbox_edit", null, 2);

Je souhaite déplacer le fichier du répertoire "uploads" vers "uploads/new-directory" lorsque $ current_value == 'yes'.

Pouvez-vous m'aider?

1
user1443216

Il semble impossible de trouver le bon filtre pour le traiter dans l'instant présent (où le formulaire de modification est en cours de sauvegarde), d'autant plus que attachment_fields_to_edit peut être utilisé à plusieurs endroits. Mais peut-être savez-vous déjà? Cela vous donnera un bon départ quand même ...

add_filter('??attachment_fields_save_filter??','move_attachment_directory',10,2);

function move_attachment_directory($form_fields,$post) {

$attach_id = $post->ID;
if (!isset($_POST['attachments'][$attach_id]['my_select'])) {return;}
if ($_POST['attachments'][$attach_id]['my_select'] == 'no') {return;}

// set directories
$uploaddir = wp_upload_dir();
$newdirectory = 'new-directory'; // or whatever it is

// get attachment metadata
$attachdata = wp_get_attachment_metadata($attach_id);

// move original image
$filepath = trailingslashit($uploaddir).$attachdata['file'];
$newfilepath = trailingslashit($uploaddir).trailingslashit($newdirectory).$attachdata['file'];
rename($filepath,$newfilepath);
$attachdata['file'] = trailingslashit($newdirectory).$attachdata['file'];

// move each attachment size too
foreach ($attachdata['sizes'] as $size => $data) {
    $file = $data['file'];
    $filepath = trailingslashit($uploaddir).$data['file'];
    $newfilepath = trailingslashit($uploaddir).trailingslashit($newdirectory).$data['file'];
    rename($filepath,$newfilepath);
    $data['file'] = trailingslashit($newdirectory).$data['file'];
    $attachdata['sizes'][$size] = $data;
}

// update attachment metadata
wp_update_attachment_metadata($attach_id,$attachdata);

}

Remarque: Je ne pense pas que cela fonctionnera tel quel si vous avez des médias triés par mois/année.

Dans tous les cas, il s'agit d'un code non testé et qui peut comporter des bogues de chemin, etc. Il peut donc s'avérer nécessaire de travailler dans un environnement de test, mais cela montre que cela peut être fait et si tout va bien, cela vous mènera à l'étape suivante ...

2
majick