Dynamisches Ändern der Größe von WordPress-Bildern im Handumdrehen (benutzerdefinierte Feld- / Designoption)

12

Also - auf Wunsch eines Kunden muss ich in der Lage sein, die Größe eines Bildes nicht wie in WordPress üblich zu ändern ... sondern anhand eines Bildes, das aus einer Theme-Option ausgewählt wurde. Ich kann nicht einfach den Bereich custom_header verwenden, da es zwei oder drei gibt (ich habe auch einige Optionen, sobald das Bild hochgeladen ist, damit der Benutzer auswählen kann, wie der Link funktionieren soll (Seite, Beitrag, Kategorie, kein Link, externer Link) , etc)). Ich verwende Options Framework Theme mit großem Erfolg und kann das Bild src problemlos abrufen. Es ist eine Frage, ob dies in Kombination mit der Funktion add_image_size () verwendet werden kann, die normalerweise für Post-Thumbnails verwendet wird. Ich würde WIRKLICH lieber nicht den Timthumb-Weg gehen und mich an WordPress-APIs halten (ich weiß, das ist ein bisschen widersprüchlich zu dem, was ich überhaupt mache ...). Jede Hilfe wäre sehr dankbar. Vielen Dank!

Zach
quelle
1
Ok - ich denke, ich habe das vielleicht geschafft: <?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' ); ?> Sieht jemand hier Sicherheitslücken oder Merkwürdigkeiten? Könnte auch für andere nützlich sein. Vielen Dank!
Zach
Da in der 'guid' die Bild-URL gespeichert ist (das Options Framework verwendet den WooThemes Media Uploader, um diese Daten als Anhang post_type zu speichern), kann ich auf die Daten als solche zugreifen :)
Zach
1
Der Vollständigkeit halber nur hinzugefügt. Sollte nicht geschlossen werden, da eine andere Lösung nicht schadet.
Kaiser
1
Ich habe dieses Problem auf so vielen Websites, die ich erstellt habe, konfrontiert. Ich konnte keine optimale Lösung finden und habe mein eigenes Plugin erstellt! Ich hoffe das hilft! wordpress.org/plugins/fly-dynamic-image-resizer
Junaid Bhura

Antworten:

6

Ändern Sie die Größe von WordPress-Bildern im Handumdrehen mithilfe der integrierten WordPress-Funktionen.

Verwenden Sie diese vt_resizeFunktion, um die Größe von WordPress-Bildern in einem benutzerdefinierten Feld, einem empfohlenen Bild, einem Upload-Verzeichnis, dem NextGen Gallery WordPress-Plugin oder sogar einem externen Link zu einem externen Bild dynamisch zu ändern.

Es ist sehr einfach zu bedienen, kopieren Sie einfach den folgenden Code in die functions.phpDatei Ihres WordPress-Themes Ihres aktuell aktivierten WordPress-Themes.

Wenden Sie sich dann, wo immer Sie die Größe eines Bildes ändern müssen, einfach an diese Funktion, indem Sie den in den Kommentaren der Funktion erläuterten Parametern folgen.

Hier ist ein Beispiel für das automatische Abrufen der Beitrags-ID, des Beitrags selbst, der benutzerdefinierten Feldwerte des Beitrags und das dynamische Ändern der Größe des Bilds aus dem benutzerdefinierten Feld, das das Bild enthält, um die Größe dynamisch im laufenden Betrieb zu ändern.

<?php
// Place this in your functions.php 
function get_postID(){
    global $wp_query;
    $thePostID = $wp_query->post->ID;
}
?>

<?php
// Place the following lines where you want to perform this action.
$postID = get_postID();// Obtain the current Post ID.
$post = get_post($postID);// Takes the current Post ID and returns the database record.
$custom = get_post_custom($post->ID);// Returns a multidimensional array with all custom fields of the Post.
$image = $custom['field-slug'][0];// Specify the array key of the Custom Field containing the image.
// The first parameter is blank. Meaning, we will not be using a Post Attachment.
// The second parameter is the image from our Post's Custom Field value.
// The third and fourth parameters are the width and height of the image after the re-size is performed.
// The fifth parameter means we want to crop this image.
$resizedImage = vt_resize('', $image, 190, 338, true);// Dynamically re-size our image on the fly.
echo '<img src="'.$resizedImage[url].'" width="'.$resizedImage[width].'" height="'.$resizedImage[height].'" title="'.$post->post_title.'" alt="'.$post->post_title.'" />';// The image properties are held in an array. (Use print_r($resizedImage) for array properties.)
?>

Ändern Sie die Größe von WordPress-Bildern im Handumdrehen vt_resize mit Unterstützung für mehrere Sites

  • Beschreibung: Ändern Sie die Größe von Bildern dynamisch mit den in WordPress integrierten Funktionen.
  • Urheber: Victor Teixeira
  • Anforderungen: PHP 5.2+, WordPress 3.2+

Ich habe den Quellcode neu formatiert, damit er für meine eigenen Augen besser lesbar ist. Wenn Sie den ursprünglich formatierten Quellcode möchten, besuchen Sie den obigen Link.

<?php
/*
* Resize images dynamically using wp built in functions
* Victor Teixeira
*
* php 5.2+
*
* Exemplo de uso:
*
* <?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
*/
if(!function_exists('vt_resize')){
    function vt_resize($attach_id = null, $img_url = null, $width, $height, $crop = false){
    if($attach_id){
        // this is an attachment, so we have the ID
        $image_src = wp_get_attachment_image_src($attach_id, 'full');
        $file_path = get_attached_file($attach_id);
    } elseif($img_url){
        // this is not an attachment, let's use the image url
        $file_path = parse_url($img_url);
        $file_path = $_SERVER['DOCUMENT_ROOT'].$file_path['path'];
        // Look for Multisite Path
        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);
    // check if file exists
    $base_file = $file_info['dirname'].'/'.$file_info['filename'].'.'.$file_info['extension'];
    if(!file_exists($base_file))
    return;
    $extension = '.'. $file_info['extension'];
    // the image path without the extension
    $no_ext_path = $file_info['dirname'].'/'.$file_info['filename'];
    $cropped_img_path = $no_ext_path.'-'.$width.'x'.$height.$extension;
    // checking if the file size is larger than the target size
    // if it is smaller or the same size, stop right here and return
    if($image_src[1] > $width){
        // the file is larger, check if the resized version already exists (for $crop = true but will also work for $crop = false if the sizes match)
        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 or no height set
        if($crop == false OR !$height){
            // calculate the size proportionaly
            $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;
            // checking if the file already exists
            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;
            }
        }
        // check if image width is smaller than set width
        $img_size = getimagesize($file_path);
        if($img_size[0] <= $width) $width = $img_size[0];
            // Check if GD Library installed
            if(!function_exists('imagecreatetruecolor')){
                echo 'GD Library Error: imagecreatetruecolor does not exist - please contact your webhost and ask them to install the GD library';
                return;
            }
            // no cache files - let's finally resize 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]);
            // resized output
            $vt_image = array(
                'url'   => $new_img,
                'width' => $new_img_size[0],
                'height'    => $new_img_size[1]
            );
            return $vt_image;
        }
        // default output - without resizing
        $vt_image = array(
            'url'   => $image_src[0],
            'width' => $width,
            'height'    => $height
        );
        return $vt_image;
    }
}
?>
Michael Ecklund
quelle
Heres eine viel einfachere Funktion (keine Multi-Site - Unterstützung, aber habe jemand in ihrer rechten Verstand Gebrauch Multi-Site?) Github.com/BrettMW/img_resize
developerbmw
Auch eine gebrauchsfertige Lösung github.com/bueltge/WP-Image-Resizer , wie der Link von @kaiser
bueltge
@bueltge, es funktioniert, aber hast du eine Idee, warum die Bilder unscharf sind? Es scheint, es macht alle Bilder 150x150. Irgendeine Idee, warum das passiert?
Ionut
@bueltge, vergiss es. Ich habe das Problem gefunden. Ich musste die Größe als zweiten Parameter auf full setzen, wenn ichwp_get_attachment_image_url()
Ionut
@bueltge, kratz das. Es scheint, dass es nicht funktioniert ... können Sie mir bitte dabei helfen? Wenn ich die Bildgröße hinzufüge full, haben Bilder unterschiedliche Größen.
Ionut