Folosirea media_handle_upload pentru încărcarea imaginilor în WordPress
Încerc să încarc o imagine în WordPress folosind o funcție...
Am găsit metoda de a încărca imagini, dar există o problemă...
Când utilizatorul încarcă imaginea, WordPress creează mai multe imagini cu dimensiuni diferite, iar asta este o problemă pentru că vreau doar o singură imagine.
Uită-te la folderul wp-content/uploads/2010/10 (aceasta este o singură imagine, dar WordPress creează aceeași imagine în dimensiuni diferite).
https://i.sstatic.net/fn6ab.jpg
Acesta este codul meu:
<?php /*
Șablon: Pagină de Încărcare
*/?>
<?php get_header();
?><div class="container_12">
<div id="content">
<form id="file-form" enctype="multipart/form-data" action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="POST">
<p id="async-upload-wrap">
<label for="async-upload">Încărcare</label>
<input type="file" id="async-upload" name="async-upload"> <input type="submit" value="Încarcă" name="html-upload">
</p>
<p>
<input type="hidden" name="post_id" id="post_id" value="<?php echo '212';?>" />
<?php wp_nonce_field('client-file-upload'); ?>
<input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>" />
</p>
<p>
<input type="submit" value="Salvează toate modificările" name="save" style="display: none;">
</p>
</form>
<?php
if ( isset( $_POST['html-upload'] ) && !empty( $_FILES ) ) {
require_once(ABSPATH . 'wp-admin/includes/admin.php');
$id = media_handle_upload('async-upload', 1199); //ID-ul postării paginii Fișiere Client
unset($_FILES);
if ( is_wp_error($id) ) {
$errors['upload_error'] = $id;
$id = false;
}
if ($errors) {
echo "<p>A apărut o eroare la încărcarea fișierului tău.</p>";
} else {
echo "<p>Fișierul tău a fost încărcat.</p>";
}
}
get_sidebar();
get_footer();?>
Cum pot face să fie doar o singură imagine?
Sper că mă înțelegi ^* pentru că limba mea ><

Folosește wp_handle_upload()
pentru a gestiona încărcările manual, fără a crea atașamente sau redimensionări.
Funcția media_handle_upload()
creează de fapt un post de tip atașament, iar procesul de redimensionare are loc când este apelată funcția wp_generate_attachment_metadata
. Dacă nu apelezi această funcție, atunci nu vor avea loc redimensionări.

Marcaj HTML:
<p>
<label for="custom-upload">Încarcă Imagine Nouă:</label>
<input type="file" tabindex="3" name="custom-upload" id="custom-upload" />
</p>
<?php
/*Preluarea imaginii*/
$attachment = get_post_meta($postid, 'custom_image');
if($attachment[0]!='')
{
echo wp_get_attachment_link($attachment[0], 'thumbnail', false, false);
}
?>
Încărcarea imaginii:
<?php
global $post; /*Obiectul global post*/
$post_id = $post->ID; /*Obținerea ID-ului postului curent*/
$upload = $_FILES['upload']; /*Recepționarea imaginii încărcate din formular*/
add_custom_image($post_id, $upload); /*Apelarea funcției de încărcare a imaginii*/
function add_custom_image($post_id, $upload)
{
$uploads = wp_upload_dir(); /*Obține calea directorului de încărcare din WordPress*/
if (is_writable($uploads['path'])) /*Verifică dacă directorul de încărcare are permisiuni de scriere*/
{
if ((!empty($upload['tmp_name']))) /*Verifică dacă imaginea încărcată nu este goală*/
{
if ($upload['tmp_name']) /*Verifică dacă imaginea a fost încărcată în directorul temporar*/
{
$file=handle_image_upload($upload); /*Apelăm funcția noastră personalizată pentru a ÎNCĂRCA EFECTIV imaginea*/
$attachment = array /*Creăm un atașament pentru postul nostru*/
(
'post_mime_type' => $file['type'], /*Tipul atașamentului*/
'post_parent' => $post_id, /*ID-ul postului*/
);
$aid = wp_insert_attachment($attachment, $file['file'], $post_id); /*Inserează atașamentul postului și returnează ID-ul atașamentului*/
$a = wp_generate_attachment_metadata($aid, $file['file'] ); /*Generează metadate pentru noul atașament*/
$prev_img = get_post_meta($post_id, 'custom_image'); /*Obține imaginea încărcată anterior*/
if(is_array($prev_img))
{
if($prev_img[0] != '') /*Dacă imaginea există*/
{
wp_delete_attachment($prev_img[0]); /*Șterge imaginea anterioară*/
}
}
update_post_meta($post_id, 'custom_image', $aid); /*Salvează ID-ul atașamentului în metadate*/
if ( !is_wp_error($aid) )
{
wp_update_attachment_metadata($aid, wp_generate_attachment_metadata($aid, $file['file'] ) ); /*Dacă nu există erori, actualizează metadatele imaginii nou încărcate*/
}
}
}
else
{
echo 'Te rog încarcă imaginea.';
}
}
}
function handle_image_upload($upload)
{
global $post;
if (file_is_displayable_image( $upload['tmp_name'] )) /*Verifică dacă este imagine*/
{
/*gestionează fișierul încărcat*/
$overrides = array('test_form' => false);
$file=wp_handle_upload($upload, $overrides);
}
return $file;
}
?>

Dacă utilizați WordPress 3.x, accesați Admin > Setări > Media.
În secțiunea "Dimensiuni imagine", setați toate valorile la zero (0) și debifați caseta "Decupare miniatură la dimensiunile exacte".
Faceți clic pe "Salvare modificări" și WordPress nu va mai crea miniaturi.

+1, tocmai voiam să postez exact același lucru.. (am petrecut ultimele 5-10 minute testând încărcările și dimensiunile intermediare)..

problema încă există .. acestea sunt dimensiunile implicite: $default_sizes = array('large', 'medium', 'thumbnail' ); Eu vreau ca dimensiunile implicite să fie 'thumbanil', 'photo_author', 'big_image' .. etc (photo_author = 20 * 20 ) , (big_image = 600 * 600 ) de exemplu ..

@AboSami Nu asta ai cerut în întrebarea ta inițială. Ai spus "wordpress creează mai multe imagini cu dimensiuni diferite, aceasta este o problemă pentru că eu vreau o singură imagine". Dacă acum ai nevoie să știi cum să ADĂUGAți dimensiuni personalizate sau să redenumești dimensiunile existente, aceasta este o întrebare diferită și ar trebui postată separat. Dar în timp ce suntem la subiect - de ce îți pasă cum se numesc intern? Doar schimbă 'medium' la 20*20 și 'large' la 600*600. Oricare dintre dimensiunile standard pot fi setate la orice lățime și înălțime dorești folosind panoul de administrare.
