Сделать Wordpress wp_delete_attachment удалять файлы из предопределенной пользовательской папки
Мы создали пользовательский тип сообщения, который позволяет нашему клиенту загружать файлы в папку вне стандартной папки для загрузки Wordpress (wp-content/upload-assets). Эти файлы должны обрабатываться отдельно от стандартной папки wp-content/uploads, поэтому мы НЕ МОЖЕМ использовать
define( 'UPLOADS', 'mycustomfolder' );
в wp-config.php.
Вместо этого мы используем это, чтобы временно изменить папку uploads на wp-content/upload-assets:
add_filter('upload_dir', 'my_upload_dir');
$uploaded_file = wp_handle_upload($_FILES['xxxx_image'], $upload_overrides);
remove_filter('upload_dir', 'my_upload_dir');
Мы используем это, чтобы удалить все вложения из определенного сообщения:
add_filter('upload_dir', 'my_upload_dir');
$attachments = get_posts( array(
'post_type' => 'attachment',
'posts_per_page' => -1,
'post_status' => 'any',
'post_parent' => $pid
) );
foreach ( $attachments as $attachment ) {
if ( false === wp_delete_attachment( $attachment->ID, true ) ) {
echo 'Attachment could not be deleted.';
}
}
remove_filter('upload_dir', 'my_upload_dir');
wp_delete_attachment также должен удалить все связанные файлы с диска, но он не работает, потому что наши файлы находятся в нашей настраиваемой папке (wp-content/upload-assets).
Вот код нашей функции my_upload_dir:
function my_upload_dir($upload) {
$upload['subdir'] = '';
$upload['basedir'] = WP_CONTENT_DIR;
$upload['baseurl'] = WP_CONTENT_URL;
$upload['path'] = $upload['basedir'] . '/upload-assets';
$upload['url'] = $upload['baseurl'] . '/upload-assets';
return $upload;
}
Как заставить wp_delete_attachment удалять файлы в нашей пользовательской папке wp-content/upload-assets?
Ответы
Ответ 1
Привет Вы можете сделать это, если хотите удалить файл, но он не удалит все почтовые метаполя, таксономия, комментарии и т.д., связанные с вложением.
Надеемся на эту помощь
foreach ( $attachments as $attachment ) {
if ( false === wp_delete_attachment( $attachment->ID, true ) ) {
$file = get_attached_file( $attachment->ID );
$file = str_replace( "uploads", "upload-assets", $file);
wp_delete_file( $file );
}
}
Я не тестировал этот код, но надеюсь, что он должен работать
Ответ 2
Оставаясь в области текущего вопроса, вы можете использовать фильтр "get_attached_file", чтобы напрямую изменить строку пути к файлу, используемую для захвата пути файла, который нужно удалить. В частности, добавьте эту функцию в свои функции. Php
function sr_update_uploads_directory( $file )
{
return str_replace( "uploads", "upload-assets", $file) // Change path to upload-assets from uploads
}
add_filter( 'get_attached_file', 'sr_update_uploads_directory' );
У нас нет времени для тестирования. Поэтому, пожалуйста, извините меня за это. Надеюсь, поможет.:)