WordPress中imagettftext()函数无法正常工作的问题求助
WordPress中imagettftext()函数无法正常工作的问题求助
看起来你在使用GD库的imagettftext()生成图片时碰了壁——返回bool(false)、生成的图是黑块,但imagestring()却能正常工作,这确实让人头疼。咱们一步步拆解问题,找出症结所在:
先说说你代码里几个明显的问题
重复写入字体文件+错误的权限设置
你连续执行了两次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);字体路径不可靠
你用./font.ttf这种相对路径很容易踩坑——PHP的当前工作目录不一定是你脚本所在的目录。在WordPress插件里,最好用绝对路径,比如借助plugin_dir_path(__FILE__)来获取插件目录的绝对路径:$myfont = plugin_dir_path(__FILE__) . 'font.ttf';这样不管脚本在哪里被调用,路径都是准确的。
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
相关产品推荐
相关产品推荐

