Comment l'attachement proprement suppression mais conserver fichier d'origine?
-
16-10-2019 - |
Question
wp_delete_attachment()
est très complet et efface toute trace d'attachement de base de données et le disque.
Y at-il moyen facile de garder le fichier original? Forker sous un autre nom n'est pas une option, parce que d'autres fonctions comme wp_delete_post()
seront toujours appeler la version originale.
La solution
année et d'autres plus tard avec des compétences beaucoup améliorées, Behold:
Keep_Deleted_Attachment_File::on_load();
/**
* Keep original file when deleting attachments.
*/
class Keep_Deleted_Attachment_File {
static private $file;
static function on_load() {
add_action( 'init', array( __CLASS__, 'init' ) );
}
static function init() {
add_action( 'delete_attachment', array( __CLASS__, 'delete_attachment' ) );
}
/**
* @param int $post_id attachment being deleted
*/
static function delete_attachment( $post_id ) {
self::$file = get_attached_file( $post_id );
add_filter( 'wp_delete_file', array( __CLASS__, 'wp_delete_file' ) );
}
/**
* @param string $file path to file being deleted
*
* @return string|bool no change or boolean false to prevent file deletion
*/
static function wp_delete_file( $file ) {
if ( ! empty( self::$file ) && self::$file == $file ) {
remove_filter( current_filter(), array( __CLASS__, __FUNCTION__ ) );
return false;
}
return $file;
}
}
Autres conseils
En supposant $attachment_id
est l'ID de la pièce jointe que vous souhaitez supprimer sans supprimer le fichier, cela devrait le faire:
$wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->posts, $wpdb->postmeta WHERE $wpdb->posts.ID = %d OR $wpdb->postmeta.post_id = %d", $attachment_id, $attachment_id ) );
Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange