从SAVE_POST挂钩(或等效挂钩)执行`createImagefrom mpng()`

时间:2016-04-21 作者:berentrom

我在执行上有困难createimagefrompng() 从钩子上。我使用了非常简单的PHP方法向图像添加水印。如果我在这个函数中硬编码图像URL,例如从一个页面或任何看起来完美无瑕的地方执行它,但是每当我从一个钩子中执行确切的函数(为刚刚上传到帖子的图像添加水印),WordPress似乎会“崩溃”(如中所示,加载微调器一直旋转,实际上什么都没有发生)。

我用于水印的PHP代码-当从模板或其他任何地方调用时,它可以完美地工作:

// 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);
每当我将其放入函数中,并逐部分注释代码时,它似乎已经在第一次崩溃$stamp = ... 线我真的不明白为什么会这样。

tl;dr scenario sketchI希望在特定posttype中的ACF字段中上载的每个图像中添加水印,但PHP中提供的水印PHP代码除外。net文档在第一行代码上崩溃。

谢谢大家!

1 个回复
最合适的回答,由SO网友:cybmeta 整理而成

使用header() 函数在请求过程中生成输出并使其崩溃。

要修改上载的图像,应使用wp_handle_upload 筛选而不是save_post 行动此外,理想情况下,您应该使用WP_Image_Editor 类,它将使用服务器中可用的最佳图像处理库(GD、Imagemagick),并触发其他插件可以使用的几个过滤器和操作:

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;
}
如果我们遵循this implementation extending WP_Editor_Image class:

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