Comment l'attachement proprement suppression mais conserver fichier d'origine?

wordpress.stackexchange https://wordpress.stackexchange.com/questions/9627

  •  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.

Était-ce utile?

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
scroll top