Am avut de câteva ori nevoie să descarc un fișier extern și să-l adaug în biblioteca media din WordPress. Eventual să-l și atașez unui post.
Prin urmare am scris clasa de mai jos – pe care o mai ajustez pe ici pe colo când este nevoie.
Se folosește așa:
$fetcher = new Media_Fetcher($post->ID);
$fetcher->fetch('http://....url');
class Media_Fetcher
{
private $postID;
public function __construct($postID = null)
{
$this->postID = $postID;
}
public function fetch($url, $filename = null)
{
$this->maybeRequireWpMediFiles();
$fetchedFile = download_url($url);
if (is_wp_error($fetchedFile)) {
throw new \Exception($fetchedFile->get_error_message() . ": {$url}");
}
if (is_null($filename)) {
$filename = uniqid(time() . true);
}
$extension = explode('.', $url);
if (\count($extension) > 1) {
$filename .= '.' . end($extension);
}
return $this->insertFileToMediaLibrary([
'name' => $filename,
'tmp_name' => $fetchedFile,
'size' => filesize($fetchedFile),
]);
}
protected function maybeRequireWpMediFiles()
{
if (\function_exists('media_handle_upload')) {
return;
}
require_once ABSPATH . 'wp-admin' . '/includes/image.php';
require_once ABSPATH . 'wp-admin' . '/includes/file.php';
require_once ABSPATH . 'wp-admin' . '/includes/media.php';
}
protected function insertFileToMediaLibrary($file)
{
$this->maybeRequireWpMediFiles();
$uploadFile = media_handle_sideload($file, $this->postID);
if (is_wp_error($uploadFile)) {
throw new \Exception($uploadFile->get_error_message() . ": {$file}");
}
$path = wp_upload_dir();
$file['id'] = $uploadFile;
$file['path'] = $path['path'] . \DIRECTORY_SEPARATOR . "{$file['name']}";
update_attached_file($file['id'], $file['path']);
wp_generate_attachment_metadata($file['id'], $file['path']);
return [
'file' => $file,
'fileID' => $uploadFile,
'mime' => get_post_mime_type($uploadFile),
];
}
}