Cum să redimensionezi dinamic imagini în WordPress din mers (câmp personalizat/opțiune temă)

29 nov. 2011, 19:20:43
Vizualizări: 23.3K
Voturi: 12

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!

5
Comentarii

Ok - Cred că am reușit să realizez asta:

<?php $main_image = of_get_option('of_main_image'); $thepost = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE guid = '$main_image'" ) ); $theID = $thepost->ID; echo wp_get_attachment_image( $theID, 'homepage_main' ); ?>

Vede cineva vreun risc de securitate sau ciudățenii aici? Ar putea fi util și pentru alții. Mulțumesc!

Zach Zach
29 nov. 2011 21:36:23

Deoarece 'guid' este locul unde este stocat URL-ul imaginii (Options Framework utilizează WooThemes Media Uploader pentru a stoca aceste date ca post_type de tip attachment), pot accesa datele în acest fel :)

Zach Zach
29 nov. 2011 22:34:43

Am adăugat acest lucru pentru completitudine. Nu ar trebui să fie închis, deoarece o altă soluție nu va face rău.

kaiser kaiser
17 iul. 2012 18:36:20

Am întâmpinat această problemă pe atât de multe site-uri pe care le-am construit. Nu am găsit o soluție care să funcționeze într-un mod optim, așa că am creat propriul meu plugin! Sper că acest lucru vă va fi de folos! https://wordpress.org/plugins/fly-dynamic-image-resizer/

Junaid Bhura Junaid Bhura
30 sept. 2015 16:50:26
Toate răspunsurile la întrebare 1
7

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;
    }

}

?>
13 iul. 2012 00:09:58
Comentarii

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

brettwhiteman brettwhiteman
21 mai 2015 03:08:47

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

bueltge bueltge
1 oct. 2015 07:36:17

@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?

Ionut Necula Ionut Necula
9 mar. 2017 12:53:07

@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()

Ionut Necula Ionut Necula
9 mar. 2017 12:56:49

@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.

Ionut Necula Ionut Necula
9 mar. 2017 15:20:36

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.

bueltge bueltge
9 mar. 2017 15:35:22

Acesta este un exemplu excelent de redimensionare a imaginilor. Bună treabă!

kuldip Makadiya kuldip Makadiya
2 apr. 2020 17:30:19
Arată celelalte 2 comentarii