使用wp_generate_attachment_metadata将图像以编程方式添加到媒体库中的操作随机失败


8

我正在LAMP服务器(共享主机)上使用PHP 5.6.12运行最新的WordPress版本(4.6)。

我想编程方式添加10幅图像,使用FTP的上传wp-uploads目录,到媒体库使用三个WordPress的功能wp_insert_attachmentwp_generate_attachment_metadatawp_update_attachment_metadata

我的问题:

有时,我的PHP脚本有效(将所有10个图像正确添加到媒体库中)-有时却不起作用(在10个图像中,仅添加了4、5、6个左右)!每个图像的大小为2M-4M。

到目前为止,我所做的是:

我通过php.ini启用了error_logging,发现每隔一段时间wp_generate_attachment_metadata就会失败(例如,在处理第5,第6,第7图像时),并且整个PHP脚本终止。除此之外,我没有从error_log()获得更多信息。由于我怀疑内存问题,因此将php的内存大小增加到120M(我的托管提供程序给我128M),并将脚本执行增加到100s(我的托管提供程序给我120s)。所有文件都存在(当然),它们都是PNG-就像我说的那样,使用同一组10张图像进行测试,它有时有效,有时却无效...

我的问题:

  • wp_generate_attachment_metadataWP 4.6 是否存在已知问题?在我将网站从WP 4.3升级到4.6之前,一切工作正常。

  • 如果没有足够的内存导致此问题,我该如何优化我的PHP脚本以处理Web托管程序给定的128M内存限制?

  • 如何确定内存不足是否导致我的PHP脚本终止?

提前致谢!

这是我的代码:

$post_id = 1234;
$images = array('filename1.png', 'filename2.png', ... 'filename10.png');

for($i = 0; $i < 10; $i++) {
  $attachment = array(
    'post_mime_type' => 'image/png',
    'post_title' => 'my description',
    'post_content' => 'my description',
    'post_status' => 'inherit'
  );
  $image_id = wp_insert_attachment($attachment, $images[$i], $post_id);
  $image_data = wp_generate_attachment_metadata($image_id, $images[$i]);
  wp_update_attachment_metadata($image_id, $image_data);
}

Answers:


12

我已经检查了您的代码,但我认为您缺少图像的向导。请看下面的代码:


$post_id = 1234;
$images = array('filename1.png', 'filename2.png', ... 'filename10.png');

// Get the path to the upload directory.
$wp_upload_dir = wp_upload_dir();

foreach($images as $name) {
    $attachment = array(
        'guid'=> $wp_upload_dir['url'] . '/' . basename( $name ), 
        'post_mime_type' => 'image/png',
        'post_title' => 'my description',
        'post_content' => 'my description',
        'post_status' => 'inherit'
         );
$image_id = wp_insert_attachment($attachment, $name, $post_id);
// Make sure that this file is included, as wp_generate_attachment_metadata() depends on it. require_once( ABSPATH . 'wp-admin/includes/image.php' );
// Generate the metadata for the attachment, and update the database record. $attach_data = wp_generate_attachment_metadata( $image_id, $name );
wp_update_attachment_metadata( $image_id, $attach_data );
}

有关详细信息,请参见wp_insert_attachment函数。


谢谢您指出guid我的失踪之处。我会将其添加到我的代码中,然后重试,并告诉您是否可以解决问题。
塞巴斯蒂安

1
嗯,好像是失踪guid引起了问题。有了guid,它现在可以100%工作。而缺少Guid的功能,有时会起作用,有时却没有-奇怪:-)再次感谢ashikra
塞巴斯蒂安

您的欢迎@Sebastian :)
Syed Fakhar Abbas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.