Cum să redimensionezi dinamic imagini în WordPress din mers (câmp personalizat/opțiune temă)
Așadar - la cererea unui client, am nevoie să pot redimensiona o imagine nu în modul standard WordPress... ci dintr-o imagine preluată dintr-o opțiune de temă. Nu pot folosi simplu zona custom_header, deoarece vor fi două sau trei imagini (de asemenea, am câteva opțiuni după ce imaginea este încărcată pentru a permite utilizatorului să aleagă cum ar trebui să funcționeze link-ul (pagină, articol, categorie, fără link, link extern etc.)). Folosesc Options Framework Theme cu mare succes și pot prelua src-ul imaginii fără probleme, este vorba doar dacă acest lucru poate fi cumva folosit în combinație cu funcția add_image_size() utilizată în mod normal pentru miniaturile articolelor. Aș prefera FOARTE mult să nu folosesc abordarea timthumb și să mă țin de API-urile WordPress (știu că este puțin contradictoriu cu ceea ce fac în primul rând...). Orice ajutor ar fi foarte apreciat. Mulțumesc!

Redimensionați imaginile WordPress din zbor folosind funcțiile încorporate în WordPress.
Utilizați funcția vt_resize
pentru a redimensiona dinamic imaginile WordPress situate într-un câmp personalizat, imagine reprezentativă, directorul de încărcări, plugin-ul NextGen Gallery pentru WordPress sau chiar un link extern către o imagine de pe alt site.
Este foarte simplu de utilizat, doar copiați/ lipiți codul de mai jos în fișierul functions.php
al temei WordPress activate în prezent.
Apoi, oriunde aveți nevoie să redimensionați o imagine din zbor, doar plasați un apel către acea funcție urmând parametrii de utilizare explicați în comentariile funcției.
Iată un exemplu de obținere automată a ID-ului Postului, a Postului în sine, a valorilor Câmpurilor Personalizate ale Postului și redimensionarea dinamică a imaginii din Câmpul Personalizat care conține imaginea ce urmează a fi redimensionată dinamic din zbor.
<?php
# Plasați aceasta în functions.php
function get_postID() {
global $wp_query;
return $wp_query->post->ID;
}
?>
<?php
# Plasați următoarele linii acolo unde doriți să efectuați această acțiune.
$postID = get_postID(); // Obține ID-ul curent al Postului.
$post = get_post( $postID ); // Preia ID-ul curent al Postului și returnează înregistrarea din bază de date. (alternativ, `global $post`)
$custom = get_post_custom( $post->ID ); // Returnează un array multidimensional cu toate câmpurile personalizate ale Postului.
$image = $custom['field-slug'][0]; // Specifică cheia array-ului pentru Câmpul Personalizat care conține imaginea.
# Primul parametru este 0. Înseamnă că nu se va folosi un Atașament de Post.
# Al doilea parametru este URL-ul imaginii din valoarea Câmpului Personalizat al Postului.
# Al treilea și al patrulea parametru sunt lățimea și înălțimea imaginii după redimensionare.
# Al cincilea parametru înseamnă să taie această imagine.
$resizedImage = vt_resize( 0, $image, 190, 338, true ); // Redimensionează dinamic imaginea din zbor.
echo '<img src="' . $resizedImage[ 'url' ] . '" width="' . $resizedImage[ 'width' ] . '" height="' . $resizedImage[ 'height' ] . '" title="' . $post->post_title . '" alt="' . $post->post_title . '" />'; // Proprietățile imaginii sunt stocate într-un array. (Utilizați print_r($resizedImage) pentru a vedea proprietățile array-ului.)
?>
Redimensionați imaginile WordPress din zbor cu vt_resize cu suport pentru multi-site
- Descriere: Redimensionează imagini dinamic folosind funcțiile încorporate în WordPress.
- Autor: Victor Teixeira
- Cerințe: PHP 5.2+, WordPress 3.2+
Am reformatat codul sursă pentru a fi mai ușor de citit pentru ochii mei. Dacă doriți codul sursă original formatat, vizitați link-ul de mai sus.
<?php
if ( ! function_exists( 'vt_resize' ) ) {
/**
* Redimensionează imagini dinamic folosind funcțiile încorporate în WordPress
* Victor Teixeira
*
* php 5.2+
*
* Exemplu de utilizare:
*
* <?php
* $thumb = get_post_thumbnail_id();
* $image = vt_resize($thumb, '', 140, 110, true);
* ?>
* <img src="<?php echo $image[url]; ?>" width="<?php echo $image[width]; ?>" height="<?php echo $image[height]; ?>" />
*
* @param int $attach_id
* @param string $img_url
* @param int $width
* @param int $height
* @param bool $crop
*
* @return array|void
*/
function vt_resize( int $attach_id = 0, string $img_url = '', int $width = 0, int $height = 0, bool $crop = false ) {
if ( $attach_id ) {
# acesta este un atașament, deci avem ID-ul
$image_src = wp_get_attachment_image_src( $attach_id, 'full' );
$file_path = get_attached_file( $attach_id );
} elseif ( $img_url ) {
# acesta nu este un atașament, să folosim URL-ul imaginii
$file_path = parse_url( $img_url );
$file_path = $_SERVER['DOCUMENT_ROOT'] . $file_path['path'];
# Căutați Calea pentru Multi-site
if ( file_exists( $file_path ) === false ) {
global $blog_id;
$file_path = parse_url( $img_url );
if ( preg_match( '/files/', $file_path['path'] ) ) {
$path = explode( '/', $file_path['path'] );
foreach ( $path as $k => $v ) {
if ( $v == 'files' ) {
$path[ $k - 1 ] = 'wp-content/blogs.dir/' . $blog_id;
}
}
$path = implode( '/', $path );
}
$file_path = $_SERVER['DOCUMENT_ROOT'] . $path;
}
// $file_path = ltrim( $file_path['path'], '/' );
// $file_path = rtrim( ABSPATH, '/' ).$file_path['path'];
$orig_size = getimagesize( $file_path );
$image_src[0] = $img_url;
$image_src[1] = $orig_size[0];
$image_src[2] = $orig_size[1];
}
$file_info = pathinfo( $file_path );
# verifică dacă fișierul există
$base_file = $file_info['dirname'] . '/' . $file_info['filename'] . '.' . $file_info['extension'];
if ( ! file_exists( $base_file ) ) {
return;
}
$extension = '.' . $file_info['extension'];
# calea imaginii fără extensie
$no_ext_path = $file_info['dirname'] . '/' . $file_info['filename'];
$cropped_img_path = $no_ext_path . '-' . $width . 'x' . $height . $extension;
# verifică dacă dimensiunea fișierului este mai mare decât dimensiunea țintă
# dacă este mai mică sau de aceeași dimensiune, opriți aici și returnați
if ( $image_src[1] > $width ) {
# fișierul este mai mare, verifică dacă versiunea redimensionată există deja (pentru $crop = true dar va funcționa și pentru $crop = false dacă dimensiunile coincid)
if ( file_exists( $cropped_img_path ) ) {
$cropped_img_url = str_replace( basename( $image_src[0] ), basename( $cropped_img_path ), $image_src[0] );
$vt_image = array(
'url' => $cropped_img_url,
'width' => $width,
'height' => $height
);
return $vt_image;
}
# $crop = false sau înălțimea nu este setată
if ( $crop == false OR ! $height ) {
# calculează dimensiunea proporțional
$proportional_size = wp_constrain_dimensions( $image_src[1], $image_src[2], $width, $height );
$resized_img_path = $no_ext_path . '-' . $proportional_size[0] . 'x' . $proportional_size[1] . $extension;
# verifică dacă fișierul există deja
if ( file_exists( $resized_img_path ) ) {
$resized_img_url = str_replace( basename( $image_src[0] ), basename( $resized_img_path ), $image_src[0] );
$vt_image = array(
'url' => $resized_img_url,
'width' => $proportional_size[0],
'height' => $proportional_size[1]
);
return $vt_image;
}
}
# verifică dacă lățimea imaginii este mai mică decât lățimea setată
$img_size = getimagesize( $file_path );
if ( $img_size[0] <= $width ) {
$width = $img_size[0];
}
# verifică dacă Biblioteca GD este instalată
if ( ! function_exists( 'imagecreatetruecolor' ) ) {
echo 'Eroare Biblioteca GD: imagecreatetruecolor nu există - vă rugăm să contactați furnizorul de hosting și să solicitați instalarea bibliotecii GD';
return;
}
# nu există fișiere cache - să redimensionăm în sfârșit
$new_img_path = image_resize( $file_path, $width, $height, $crop );
$new_img_size = getimagesize( $new_img_path );
$new_img = str_replace( basename( $image_src[0] ), basename( $new_img_path ), $image_src[0] );
# ieșire redimensionată
$vt_image = array(
'url' => $new_img,
'width' => $new_img_size[0],
'height' => $new_img_size[1]
);
return $vt_image;
}
# ieșire implicită - fără redimensionare
$vt_image = array(
'url' => $image_src[0],
'width' => $width,
'height' => $height
);
return $vt_image;
}
}
?>

Iată o funcție mult mai simplă (fără suport pentru multi-site, dar chiar folosește cineva cu mintea limpede multi-site?) https://github.com/BrettMW/img_resize

De asemenea, o soluție gata de folosit https://github.com/bueltge/WP-Image-Resizer, similar cu linkul de la @kaiser

@bueltge, funcționează, dar ai vreo idee de ce imaginile sunt estompate? Se pare că le face pe toate 150x150. Ai vreo idee de ce se întâmplă asta?

@bueltge, lasă, am găsit problema. A trebuit să setez dimensiunea la full ca al doilea parametru când foloseam wp_get_attachment_image_url()

@bueltge, uită ce am spus. Se pare că nu funcționează... poți să mă ajuți cu asta? Când adaug dimensiunea imaginii ca full
, imaginile au dimensiuni diferite.

cu parametrul full obții întotdeauna dimensiunea încărcată, lățimea, înălțimea originală. Ar trebui să lucrezi cu o dimensiune definită, cum ar fi custom_full care este definită cu lățime și înălțime.
