Verificando se um arquivo já está na Biblioteca de Mídia

8

Estou criando arquivos personalizados em um plugin e os adicionando à Biblioteca de mídia usando o código fornecido no Wordpress Codex para wp_insert_attachment. No entanto, meu plug-in substitui ocasionalmente esses arquivos. Preciso garantir que os arquivos não sejam adicionados novamente à Biblioteca de mídia. Aqui está o código atual:

$wp_filetype = wp_check_filetype(basename($filename), null );
$wp_upload_dir = wp_upload_dir();
$attachment = array(
   'guid' => $wp_upload_dir['baseurl'] . '/' . _wp_relative_upload_path( $filename ), 
   'post_mime_type' => $wp_filetype['type'],
   'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
   'post_content' => '',
   'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment( $attachment, $filename);
// you must first include the image.php file
// for the function wp_generate_attachment_metadata() to work
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );

Eu só preciso verificar se o arquivo já faz parte da Biblioteca de Mídia e atualizá-lo, se for. Não tenho um post_id para trabalhar, apenas o permalink e o guid.

Obrigado pela ajuda.

Dawson Goodell
fonte

Respostas:

6
global $wpdb;
$image_src = wp_upload_dir()['baseurl'] . '/' . _wp_relative_upload_path( $filename );
$query = "SELECT COUNT(*) FROM {$wpdb->posts} WHERE guid='$image_src'";
$count = intval($wpdb->get_var($query));

Você pode usar isso na parte superior do seu código. Em seguida, verifique o valor de $count. Se for 0, você poderá continuar adicionando o anexo

Mridul Aggarwal
fonte
2

Sei que essa é uma pergunta antiga, mas não gostei de nenhuma dessas respostas, então aqui está a minha solução.

Isto irá verificar se o arquivo existe. Nesse caso, ele atualizará o anexo existente; caso contrário, ele criará um novo anexo.

// Get upload dir
$upload_dir    = wp_upload_dir();
$upload_folder = $upload_dir['path'];

// Set filename, incl path
$filename = "{$upload_folder}/myfile-{$id}.pdf";

// Check the type of file. We'll use this as the 'post_mime_type'.
$filetype = wp_check_filetype( basename( $filename ), null );

// Get file title
$title = preg_replace( '/\.[^.]+$/', '', basename( $filename ) );

// Prepare an array of post data for the attachment.
$attachment_data = array(
    'guid'           => $upload_dir['url'] . '/' . basename( $filename ),
    'post_mime_type' => $filetype['type'],
    'post_title'     => $title,
    'post_content'   => '',
    'post_status'    => 'inherit'
);

// Does the attachment already exist ?
if( post_exists( $title ) ){
  $attachment = get_page_by_title( $title, OBJECT, 'attachment');
  if( !empty( $attachment ) ){
    $attachment_data['ID'] = $attachment->ID;
  }
}

// If no parent id is set, reset to default(0)
if( empty( $parent_id ) ){
  $parent_id = 0;
}

// Insert the attachment.
$attach_id = wp_insert_attachment( $attachment_data, $filename, $parent_id );

// Generate the metadata for the attachment, and update the database record.
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );

No exemplo acima, estou usando um .pdf no meu $ filename, mas você pode substituí-lo por qualquer nome de arquivo / tipo de arquivo.

Lennart
fonte
1

Eu tenho este método (obrigado Mridul):

function MediaFileAlreadyExists($filename){
    global $wpdb;
    $query = "SELECT COUNT(*) FROM {$wpdb->postmeta} WHERE meta_value LIKE '%/$filename'";
    return ($wpdb->get_var($query)  > 0) ;
}

// MediaFileAlreadyExists("my-image.png");
T.Todua
fonte
0

essa função assume como parâmetro o nome do arquivo de mídia e retorna o meta_id se existir, caso contrário, retorna (false).

function MediaFileAlreadyExists($filename){
    global $wpdb;
    $query = "SELECT meta_id FROM {$wpdb->postmeta} WHERE meta_value LIKE '%/$filename'";

    if ( $wpdb->get_var($query) ){
        return $wpdb->get_var($query);
    }

    return false;
}
hammed
fonte
0

Você pode verificar se a imagem existe com post_exists($filename). Se a imagem existe, você pode atualizá-la e também pode criá-la

 //if image exist update else create it
        if (post_exists($filename)){
                $page = get_page_by_title($filename, OBJECT, 'attachment');
                $attach_id = $page->ID;

                $attach_data = wp_generate_attachment_metadata( $attach_id, $destination ); // Generate attachment data, filesize, height, width etc.

                wp_update_attachment_metadata( $attach_id, $attach_data ); // Add the above meta data

                add_post_meta($attach_id, '_wp_attachment_image_alt', $filealt); // Add the alt text 
        }
        else{

                $attach_id = wp_insert_attachment( $attachment, $destination, $post_id ); 

                $attach_data = wp_generate_attachment_metadata( $attach_id, $destination ); 

                wp_update_attachment_metadata( $attach_id, $attach_data ); 

                add_post_meta($attach_id, '_wp_attachment_image_alt', $filealt); 
            }
Altravista
fonte
1
Você poderia adicionar uma explicação na resposta sobre como o código funciona?
kero