检查文件是否已在媒体库中

时间:2012-10-26 作者:Dawson Goodell

我正在插件中创建自定义文件,并使用Wordpress Codex for wp\\u insert\\u附件中提供的代码将其添加到媒体库中。然而,我的插件偶尔会覆盖这些文件。我需要确保文件不会再次添加到媒体库中。以下是当前代码:

$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 );
我只需要检查文件是否已经是媒体库的一部分,如果已经是,请更新它。我没有post\\u id,只有永久链接和guid。

谢谢你的帮助。

6 个回复
最合适的回答,由SO网友:Mridul Aggarwal 整理而成

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));
您可以在代码的顶部使用它。然后检查$count. 如果为0,则可以继续添加附件

SO网友:T.Todua

我有这个方法(谢谢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");

SO网友:Lennart

我知道这是一个老问题,但我不喜欢这些答案,所以这里是我的解决方案。

这将检查文件是否存在。如果是,将更新现有附件;如果没有,它将创建一个新附件。

// 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 );
在上面的示例中,我使用了。my$filename中的pdf,但您可以将其替换为任何文件名/文件类型。

SO网友:Altravista

您可以检查图像是否存在post_exists($filename) . 如果图像存在,您可以更新它,也可以创建它

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

SO网友:Jonas Merhej

我还没试过呢。但应该这么简单:

post_exists( $filename, \'\', \'\', \'attachment\' );
如果存在Post,则返回int Post ID,否则返回0。

SO网友:hammed

此函数将媒体文件名作为参数,如果存在,则返回meta\\u id,否则返回(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;
}

结束

相关推荐

Large Uploads in WordPress

我与一家教会合作,该教会使用WordPress管理其网站和播客。到目前为止,他们每周有200个步骤来发布播客(我夸大了,但这是一个庞大的逐步列表)。除其他外,他们必须:录制布道,掌握布道录音,创建MP3,通过FileZilla将MP3上传到他们的服务器,但是如果可以的话,我想简化步骤4-6。我知道一些在线应用程序能够进行非常大的上传(GMail、Dropbox等)。每个布道都有70-80 MB,太大了,无法用简单的HTML上传表单处理。如果我最大限度地限制PHP文件大小,Flash上传程序是否能够管理这样