web-dev-qa-db-fra.com

Exécution de `createimagefrompng ()` à partir du hook save_post (ou d'un hook équivalent)

J'ai des difficultés à exécuter createimagefrompng() à partir d'un crochet. J'ai utilisé la méthode relativement simple PHP pour ajouter un filigrane à une image. Si je code les URL de l'image dans cette fonction et que, par exemple, je l'exécute depuis une page ou quoi que ce soit qui semble fonctionner parfaitement, mais chaque fois que j'exécute la fonction exacte à partir d'un crochet (pour ajouter des filigranes aux images téléchargées dans un message), WordPress semble de "planter" (comme dans, le spinner de chargement continue à tourner et rien ne se passe réellement).

Le code PHP que j'utilise pour le filigrane - qui fonctionne parfaitement lorsqu'il est appelé à partir d'un modèle ou autre:

// Load the stamp and the photo to apply the watermark to
$stamp = imagecreatefrompng('stamp.png');
$im = imagecreatefromjpeg('photo.jpeg');

// Set the margins for the stamp and get the height/width of the stamp image
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);

// Copy the stamp image onto our photo using the margin offsets and the photo 
// width to calculate positioning of the stamp. 
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));

// Output and free memory
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);

Chaque fois que je mets cela dans une fonction et commente le code, partie par partie, il semble déjà planter sur la première ligne $stamp = .... Je ne peux pas vraiment comprendre pourquoi cela se produit.

tl; dr scenario sketch Je souhaite ajouter un filigrane à chaque image téléchargée dans un champ ACF dans un type de message spécifique, mais le code de filigrane PHP fourni dans les documents PHP.net se bloque sur la première ligne de code.

Merci les gars!

2
berentrom

L’utilisation de la fonction header() produit une sortie au milieu de la demande et la bloque.

Pour modifier l'image téléchargée, vous devez utiliser le filtre wp_handle_upload au lieu de l'action save_post. De plus, vous devriez idéalement utiliser la classe WP_Image_Editor, qui utilisera la meilleure bibliothèque de manipulation d'images disponible sur le serveur (Gd, Imagemagick) et déclenchera plusieurs filtres et actions pouvant être utilisés par d'autres plugins:

add_filter( 'wp_handle_upload', 'cyb_handle_upload_callback' );
function cyb_handle_upload_callback( $data ) {

    // get instance of WP_Image_Editor class
    $image = wp_get_image_editor( $data['file'] );

    if( ! is_wp_error( $image ) ) {

        // Manipulate your image here
        $stamp = imagecreatefrompng( 'path/to/stamp.png' );
        $margin_right = 10;
        $margeing_bottom = 10;
        $sx = imagesx( $stamp );
        $sy = imagesy( $stamp );

        imagecopy(
            $data['file'],
            $stamp,
            imagesx( $data['file'] ) - $sx - $margin_right,
            imagesy( $data['file'] ) - $sy - $margin_bottom,
            0,
            0,
            imagesx( $stamp ),
            imagesy( $stamp )
        );

        // Save the modified image
        $image->save();

    }

    return $data;
}

Si nous suivons cette implémentation qui étend la classe WP_Editor_Image :

add_filter( 'wp_handle_upload', 'cyb_handle_upload_callback' );
function cyb_handle_upload_callback( $data ) {

    $image = wp_get_image_editor( $data['file'] );

    if ( ! is_wp_error( $image ) && is_callable( [ $image, 'stamp_watermark' ] ) ) {

        $stamp = imagecreatefrompng( '/path/to/stamp.png' );
        $success = $editor->stamp_watermark( $stamp );

        if ( ! is_wp_error( $success ) ) {
            $image->save();
        }

    }

    return $data;
}
2
cybmeta