Chúng tôi có thể giúp gì?
Categories
< Tất cả chủ đề

Hướng dẫn sửa lỗi lưu tệp đính kèm khi chạy plugin trên localhost

Update, vấn đề này liên quan tới tổ chức file path trên máy tính, ở phiên bản 2.3.2 đã fix được lỗi lưu hình ảnh và metadata nhưng còn vấn đề xóa tệp tin cũ khi Thu thập lại bài viết thì bạn cần dùng code sau:

<?php
/**
 * Thực hiện hành động sau khi lưu bài viết và trước khi lưu các tệp đính kèm mới.
 * Tại thời điểm này, nếu đang thu thập lại bài viết, ta sẽ xử lý các tệp đính kèm cũ.
 * Xóa mỗi tệp đính kèm cũ ra khỏi thư mục uploads.
 */
add_action('kdn/post/after_save', 'kdn_post_after_save', 10, 10);
function kdn_post_after_save($data, $postData, $postBot, $postSaver, $siteId, $postUrl, $urlTuple, $isRecrawl, $postId, $isFirstPage) {

	// Nếu đang thu thập lại, hãy tiến hành
	if ($isRecrawl) {

		// Lấy ra tất cả tệp đính kèm cũ của bài viết
		$allAttachment = get_attached_media('', $postId);

		// Bắt đầu xử lý từng tệp đính kèm
		foreach ($allAttachment as $attachment) {

			// Lấy ra meta data của tệp đính kèm
			$attachmentMetadata = wp_get_attachment_metadata($attachment->ID, true);

			// Chuẩn bị đường dẫn tới thư mục chứa tệp đính kèm
			// (WordPress mặc định sẽ phân thư mục theo dạng:
			// ../wp-content/uploads/{năm}/{tháng}/tep-dinh-kem.jpg)
			// Lấy ra ../wp-content/uploads/{năm}/{tháng}/
			preg_match('/^(.+?)\/(.{4})\/(.{2})\//', $attachmentMetadata['file'], $attachmentPath);
			$attachmentPath = $attachmentPath[0];

			// Lấy ra tất cả các sizes khả dụng của tệp đính kèm
			$attachmentSizes 	= isset($attachmentMetadata['sizes']) ? $attachmentMetadata['sizes'] : '';

			// Kiểm tra xem đây có phải default thumbnail hay không
			$metaPostDefaultThumbnailByMediaId = isset(get_post_meta($attachment->ID)['_post_default_thumbnail']) ?: false;

			// Nếu không phải default thumbnail, tiến hành xóa tệp đính kèm
			if (!$metaPostDefaultThumbnailByMediaId) {

				// Nếu có các sizes, tiến hành xóa các sizes của tệp đính kèm
				if ($attachmentSizes) {
					foreach ($attachmentSizes as $attachmentSize) {
						if ($attachmentSize['file']) unlink($attachmentPath . $attachmentSize['file']);
					}
				}

				// Xóa tệp đính kèm
				unlink($attachmentMetadata['file']);

			}
		}
	}
}
?>

Trong code mình đã comment rất rõ, các bạn chịu khó đọc để hiểu cách hoạt động. Chúc bạn thành công!

Liên hệ