You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress中imagettftext()函数无法正常工作的问题求助

WordPress中imagettftext()函数无法正常工作的问题求助

看起来你在使用GD库的imagettftext()生成图片时碰了壁——返回bool(false)、生成的图是黑块,但imagestring()却能正常工作,这确实让人头疼。咱们一步步拆解问题,找出症结所在:

先说说你代码里几个明显的问题

  1. 重复写入字体文件+错误的权限设置
    你连续执行了两次file_put_contents,还把它的返回值直接传给chmod——但file_put_contents返回的是写入的字节数,不是文件路径,这会导致权限设置完全失效。正确的做法应该是先写入文件,再单独设置权限:

    $fontContent = file_get_contents("https://wodwodwod.com/wp-content/uploads/2023/08/RedHatDisplay-Bold.ttf");
    $fontPath = "/srv/htdocs/wp-content/plugins/code-snippets/php/font.ttf";
    // 先写入文件
    $writeResult = file_put_contents($fontPath, $fontContent);
    if ($writeResult === false) {
        // 处理写入失败的情况,比如输出错误日志
        error_log("无法写入字体文件");
        return;
    }
    // 再设置权限
    chmod($fontPath, 0755);
    
  2. 字体路径不可靠
    你用./font.ttf这种相对路径很容易踩坑——PHP的当前工作目录不一定是你脚本所在的目录。在WordPress插件里,最好用绝对路径,比如借助plugin_dir_path(__FILE__)来获取插件目录的绝对路径:

    $myfont = plugin_dir_path(__FILE__) . 'font.ttf';
    

    这样不管脚本在哪里被调用,路径都是准确的。

  3. imagettftext()的坐标参数错误
    你传的坐标是(0, 0),但imagettftext()的y坐标是字体基线的位置,不是图片顶部。把文字放在(0,0)的话,整个文字都会被画出图片边界,看起来就是黑块。你应该把y坐标设置成大于字体大小的数值,比如:

    imagettftext($image, 20, 0, 10, 30, $white, $myfont, "test");
    

    这里的30是字体大小(20)加上10的偏移,保证文字能显示在图片里。

额外的排查方向

  • 检查字体文件是否完整:用file_get_contents下载字体后,确认文件大小和原文件一致,或者直接打开字体文件看看是否能正常读取(避免下载到损坏的文件)。
  • 确认GD库支持FreeType:执行var_dump(gd_info()),看看输出里有没有FreeType Support => enabled,如果没有的话,需要安装/enable FreeType扩展。
  • 权限排查:确保Web服务器的运行用户(比如www-data)对字体文件和所在目录有读取权限,0755权限一般是够的,但也要确认目录的权限是否允许写入。

修改后的完整代码示例

header('Content-type:image/jpeg');

function generate_image_test() {
    $image = imagecreate(500, 90);
    $black = imagecolorallocate($image,0,0,0);
    $grey_shade = imagecolorallocate($image,40,40,40);
    $white = imagecolorallocate($image,255,255,255);

    // 下载字体并保存到插件目录
    $fontUrl = "https://wodwodwod.com/wp-content/uploads/2023/08/RedHatDisplay-Bold.ttf";
    $fontContent = file_get_contents($fontUrl);
    if ($fontContent === false) {
        error_log("无法下载字体文件");
        return "<p>生成图片失败:无法获取字体</p>";
    }

    $fontPath = plugin_dir_path(__FILE__) . 'font.ttf';
    $writeResult = file_put_contents($fontPath, $fontContent);
    if ($writeResult === false) {
        error_log("无法写入字体文件到路径:{$fontPath}");
        return "<p>生成图片失败:无法保存字体</p>";
    }
    chmod($fontPath, 0755);

    // 使用绝对路径调用字体
    $myfont = $fontPath;
    // 调整坐标让文字显示在图片内
    imagettftext($image, 20, 0, 10, 30, $white, $myfont, "test");

    ob_start();
    imagejpeg($image);
    imagedestroy($image);
    $i = ob_get_clean();

    return "<img src='data:image/jpeg;base64," . base64_encode( $i )."' id=\"instagram_challenge\">";
}

add_shortcode('image_test', 'generate_image_test');

你可以先试试这些修改,应该能解决大部分问题。如果还是不行,可以把var_dump(gd_info())的结果贴出来,或者检查服务器的错误日志,看看有没有更详细的报错信息。

备注:内容来源于stack exchange,提问作者Brayan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 16:03:05