A adição programada de imagens à biblioteca de mídia com wp_generate_attachment_metadata falha aleatoriamente

8

Estou executando a versão mais recente do WordPress (4.6) em um servidor LAMP (hospedagem compartilhada) com a versão 5.6.12 do PHP.

Eu estou tentando programaticamente adicionar 10 imagens , carregadas com ftp para o wp-uploadsdiretório, para a biblioteca de mídia usando as três funções do WordPress wp_insert_attachment, wp_generate_attachment_metadatae wp_update_attachment_metadata.

Meu problema:

Às vezes, meu script PHP funciona (todas as 10 imagens são adicionadas à biblioteca de mídia corretamente) - e às vezes não (das 10 imagens, apenas 4, 5, 6 são adicionadas)! Cada imagem tem 2M - 4M de tamanho.

O que eu fiz até agora:

Eu ativei o error_logging via php.ini e descobri que de vez em quando wp_generate_attachment_metadatafalha (ou seja, ao manipular a imagem 5, 6, 7 ou mais) e todo o meu script PHP termina. Não recebo mais informações do error_log () além disso. Como suspeitei de problemas de memória, aumentei o tamanho da memória do php para 120M (meus provedores de hospedagem me deram 128M) e a execução de scripts para 100s (meu provedor de hospedagem me deu 120s). Todos os arquivos existem (é claro), são todos PNGs - e, como eu disse, usando o mesmo conjunto de 10 imagens para teste, às vezes funciona e às vezes não funciona ...

Minha pergunta:

  • Existe um problema conhecido wp_generate_attachment_metadatano WP 4.6? Tudo funcionava bem até eu atualizar meu site do WP 4.3 para 4.6 ...

  • Se não houver memória suficiente causando o problema, como eu poderia otimizar meu script PHP para lidar com o limite de 128M de memória fornecido pelo meu web hoster?

  • Como descubro se falta de memória faz com que meu script PHP seja encerrado?

Desde já, obrigado!

Aqui está o meu código:

$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);
}
Sebastian
fonte

Respostas:

12

Verifiquei seu código e acho que você está perdendo o guia das imagens. Por favor, dê uma olhada no código abaixo:


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

Para obter detalhes, consulte a função wp_insert_attachment .

Syed Fakhar Abbas
fonte
Obrigado por apontar os desaparecidos guidpara mim. Acrescentarei isso ao meu código, tente novamente e informe se isso resolve o problema.
Sebastian
1
Hum, parece que a falta guidcausou o problema. Com o guid adicionado, agora funciona 100%. Considerando que, com o guid falta, às vezes ele trabalhou, às vezes isso não aconteceu - estranha :-) Obrigado novamente ashikra
Sebastian
Suas boas-vindas @Sebastian :)
Syed Fakhar Abbas