web-dev-qa-db-ja.com

Wp_generate_attachment_metadataを使用してプログラムでメディアライブラリに画像を追加すると、ランダムに失敗する

LAMPサーバー(共有ホスティング)でPHPバージョン5.6.12で最新のWordPressバージョン(4.6)を実行しています。

Ftpでwp-uploadsディレクトリにアップロードし、メディアライブラリに _(3つのWordPress関数wp_insert_attachmentwp_generate_attachment_metadataおよびwp_update_attachment_metadata)を使用してプログラムで10枚の画像を追加を試みます。

私の問題:

ときどき、私のPHPスクリプトが機能します(10個すべての画像がメディアライブラリに正しく追加されます)。各画像のサイズは2M - 4Mです。

これまでにやったこと:

私はphp.iniでerror_loggingを有効にし、wp_generate_attachment_metadataが時々失敗する(すなわち5、6、7程度の画像を処理している間)ことを発見し、私のPHPスクリプト全体が終了します。それ以外のerror_log()からはこれ以上情報を得られません。私はメモリの問題を疑っていたので、phpのメモリサイズを120Mに増やし(私のホスティングプロバイダから128Mに)、スクリプト実行のために100sに増やしました(私のホスティングプロバイダから120s)すべてのファイルが(もちろん)存在し、それらはすべてPNGです - そして、私が言ったように、テストのために同じ10個のイメージのセットを使用します、それは時々はたらくそして時々それは働かない...

私の質問:

  • WP 4.6のwp_generate_attachment_metadataに関する既知の問題はありますか?サイトをWP 4.3から4.6にアップグレードするまでは、すべてうまくいきました...

  • 十分なメモリが問題を引き起こしていない場合、私のWebホスティング業者によって与えられた128Mのメモリ制限を処理するためにPHPスクリプトを最適化するにはどうすればよいですか?

  • メモリ不足により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);
}
8
Sebastian

私はあなたのコードをチェックしました、そして私はあなたが画像の導きを逃していると思う。以下のコードを見てください。


$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 関数を見てください。

11