Загрузка изображения в метабоксе
29 апр. 2011 г., 14:48:27
Просмотры: 3.54K
Голосов: 3
Я пытаюсь реализовать загрузку через метабокс без использования медиабиблиотеки, но чтобы изображение добавлялось как вложение к записи.
Сейчас я просто загружаю и сохраняю файл на сервере.
<?php
define("THUMB_DIR", WP_CONTENT_DIR . '/plugins/meta-upload/thumbs/');
define("THUMB_URL", WP_CONTENT_URL . '/plugins/meta-upload/thumbs/');
// эту функцию нужно реализовать
function fileupload( $label ) { ?>
<tr>
<td class="left_label"> <?php
echo $label; ?>
</td>
<td>
<form name="uploadfile" id="uploadfile_form" method="POST" enctype="multipart/form-data" action="<?php echo $this->filepath.'#uploadfile'; ?>" accept-charset="utf-8" >
<input type="file" name="uploadfiles[]" id="uploadfiles" size="35" class="uploadfiles" />
<input class="button-primary" type="submit" name="uploadfile" id="uploadfile_btn" value="Загрузить" />
</form>
</td>
</tr>
<?php
}
// эту функцию тоже нужно добавить
function fileupload_process() {
$uploadfiles = $_FILES['uploadfiles'];
if (is_array($uploadfiles)) {
foreach ($uploadfiles['name'] as $key => $value) {
// обрабатываем только загруженные файлы
if ($uploadfiles['error'][$key] == 0) {
$filetmp = $uploadfiles['tmp_name'][$key];
// очищаем имя файла и извлекаем расширение
$filename = $uploadfiles['name'][$key];
// получаем информацию о файле
// @todo: wp проверяет расширение файла....
$filetype = wp_check_filetype( basename( $filename ), null );
$filetitle = preg_replace('/\.[^.]+$/', '', basename( $filename ) );
$filename = $filetitle . '.' . $filetype['ext'];
$upload_dir = wp_upload_dir();
/**
* Проверяем, существует ли файл с таким именем в директории,
* и переименовываем файл при необходимости
*/
$i = 0;
while ( file_exists( $upload_dir['path'] .'/' . $filename ) ) {
$filename = $filetitle . '_' . $i . '.' . $filetype['ext'];
$i++;
}
$filedest = $upload_dir['path'] . '/' . $filename;
/**
* Проверяем права на запись
*/
if ( !is_writeable( $upload_dir['path'] ) ) {
$this->msg_e('Невозможно записать в директорию %s. Проверьте права доступа.');
return;
}
/**
* Сохраняем временный файл в директорию загрузок
*/
if ( !@move_uploaded_file($filetmp, $filedest) ){
$this->msg_e("Ошибка: файл $filetmp не может быть перемещен в: $filedest ");
continue;
}
$attachment = array(
'post_mime_type' => $filetype['type'],
'post_title' => $filetitle,
'post_content' => '',
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment( $attachment, $filedest );
require_once( ABSPATH . "wp-admin" . '/includes/image.php' );
$attach_data = wp_generate_attachment_metadata( $attach_id, $filedest );
wp_update_attachment_metadata( $attach_id, $attach_data );
}
}
}
}
add_action('admin_menu', "post_upload_box_init");
add_action('save_post', 'post_save_thumb');
function post_upload_box_init() {
add_meta_box("post-thumbnail-posting", "Миниатюра Dark Toob", "post_upload_thumbnail", "post", "advanced");
}
function post_upload_thumbnail() {
global $post;
?>
<script type="text/javascript">
document.getElementById("post").setAttribute("enctype","multipart/form-data");
document.getElementById('post').setAttribute('encoding','multipart/form-data');
</script>
<?php
$thumb = get_post_meta($post->ID, 'custom_thumbnail',true);
if ( $thumb )
{
?>
<div style="float: left; margin-right: 10px;">
<img style="border: 1px solid #ccc; padding: 3px;" src="<?php echo THUMB_URL . $thumb; ?>" alt="Превью миниатюры" title="Превью загруженной миниатюры" />
</div>
<?php
}
else
{
?>
<div style="float: left; margin-right: 10px; width: 200px; height: 150px; line-height: 150px; border: solid 1px #ccc; text-align: center;">Превью миниатюры</div>
<?php } ?>
<div style="float: left;">
<p>
<label for="thumb-url-upload"><?php _e("Загрузить по URL или выбрать изображение (ниже)"); ?>:</label><br />
<input style="width: 300px; margin-top:5px;" id="thumb-url-upload" name="thumb-url-upload" type="text" />
</p>
<p>
<p><label for="thumbnail"><?php _e("Загрузить миниатюру"); ?>:</label><br />
<input id="thumbnail" type="file" name="thumbnail" />
</p>
<p><input id="thumb-delete" type="checkbox" name="thumb-delete"> <label for="thumb-delete"><?php _e("Удалить миниатюру"); ?></label></p>
<p style="margin:10px 0 0 0;"><input id="publish" class="button-primary" type="submit" value="<?php _e("Обновить запись"); ?>" accesskey="p" tabindex="5" name="save"/></p>
</div>
<div class="clear"></div>
<?php
}
function post_save_thumb( $postID )
{
global $wpdb;
// Получаем правильный ID записи, если это ревизия
if ( $wpdb->get_var("SELECT post_type FROM $wpdb->posts WHERE ID=$postID")=='revision')
$postID = $wpdb->get_var("SELECT post_parent FROM $wpdb->posts WHERE ID=$postID");
if ( $_POST['thumb-delete'] )
{
@unlink(THUMB_DIR . get_post_meta($postID, 'custom_thumbnail', true));
delete_post_meta($postID, 'custom_thumbnail');
}
elseif ( $_POST['thumb-url-upload'] || !empty($_FILES['thumbnail']['tmp_name']) )
{
if ( !empty($_FILES['thumbnail']['name']) )
preg_match("/(\.(?:jpg|jpeg|png|gif))$/i", $_FILES['thumbnail']['name'], $matches);
else
preg_match("/(\.(?:jpg|jpeg|png|gif))$/i", $_POST['thumb-url-upload'], $matches);
$thumbFileName = $postID . strtolower($matches[0]);
// Путь к миниатюре на сервере
$loc = THUMB_DIR . $thumbFileName;
$thumbUploaded = false;
if ( $_POST['thumb-url-upload'] )
{
// Пробуем скачать изображение с помощью fopen
if( ini_get('allow_url_fopen') )
{
copy($_POST['thumb-url-upload'], $loc);
$thumbUploaded = true;
}
else
// Если fopen не работает, пробуем cURL
if( function_exists('curl_init') )
{
$ch = curl_init($_POST['thumb-url-upload']);
$fp = fopen($loc, "wb");
$options = array(CURLOPT_FILE => $fp,
CURLOPT_HEADER => 0,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_TIMEOUT => 60);
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
fclose($fp);
$thumbUploaded = true;
}
}
else
// Пытаемся переместить загруженную миниатюру в нужную директорию
if ( !empty($_FILES['thumbnail']['tmp_name']) && move_uploaded_file($_FILES['thumbnail']['tmp_name'], $loc) )
$thumbUploaded = true;
if ( $thumbUploaded )
{
if ( !update_post_meta($postID, 'custom_thumbnail', $thumbFileName) )
add_post_meta($postID, 'custom_thumbnail', $thumbFileName);
}
}
}

chrismccoy
309
Комментарии
Все ответы на вопрос
1
2
Возможно, вам будет интересно взглянуть на плагин Стива Тейлора и его подход здесь
Доминик "ocean90" Шиллинг — автор (новой в 3.5) медиабиблиотеки, у него есть репозиторий на GitHub, где он демонстрирует некоторые примеры.
Короче говоря, с его руководствами вы, возможно, не сможете реализовать загрузчик медиафайлов с drag&drop в метабоксе, но это должно быть возможно... каким-то образом.

kaiser
50.8K
29 апр. 2011 г. 14:55:20
Комментарии
Плагин больше не поддерживается. Ищу конкретное решение в качестве ответа вместо ссылки. :)

4 июл. 2013 г. 07:31:15
Похожие вопросы