更改附件文件名


11

是否有一个功能可以根据我拥有的附件ID更改附件的文件名?

谢谢!丹尼斯

Answers:


22

这样,您可以在附件上传后立即重命名:

add_action('add_attachment', 'rename_attachment');
function rename_attachment($post_ID){

    $file = get_attached_file($post_ID);
    $path = pathinfo($file);
        //dirname   = File Path
        //basename  = Filename.Extension
        //extension = Extension
        //filename  = Filename

    $newfilename = "NEW FILE NAME HERE";
    $newfile = $path['dirname']."/".$newfilename.".".$path['extension'];

    rename($file, $newfile);    
    update_attached_file( $post_ID, $newfile );

}

1
非常精确地解释了:)
booota

嗯,我得到这个rename():http包装器不支持重命名
Bakaburg

这里有错字。该函数应被调用rename_attachment
Avishai

我想为清楚起见,如果将$ post_ID命名为$ attach_ID或类似名称,会更好,因为它可能与父帖子ID混淆,而原本是附件ID。好的答案:)
阿曼多

请注意,这不会更改附件guid,因此依赖guid获取图像源的代码将无法工作。尽管通常来说您不应该更改发布Guid,但在这种情况下,也应该更新该Guid。
阿曼多

4

用例

该功能适用​​于

  • 添加文件
  • 更新文件(是,也适用于已经存在的文件)
  • 多个文件

无用例

它会中止由wordpress自动执行的自动保存作业,或者不符合目标文件类型或mime类型的文件。

好东西

您可以在foreach循环之前在函数内设置要更改的文件名,文件类型和mime类型。该文件将获得帖子ID,然后附加附件ID,因此您可以一次安全地上传和更改多个文件。这也关心按(第一个)帖子ID和(第二个)附件ID排序文件。

function wpse30313_update_attachment_names($post_ID)
{
    // Abort if WP does an autosave 
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
        return;

    # >>>> SET
        // New file name:
        $new_file_name = "___";

        // Best would be to take the post name as file name instead of a custom title:
        # $post_data = get_post( $post_ID );
        # $new_file_name = $post_data->post_name;

        // The file types we want be changed:
        $allowed_types = array(
            'image'
        );

        // The mime types we want to be changed:
        $allowed_ext = array(
             'jpg'
            ,'jpeg'
            ,'gif'
            ,'png'
        );
    # <<<< SET

    // Appended by post ID for collision safety
    $new_file_name = "{$new_file_name}-{$post_ID}";

    // get all attached files
    $attachments = get_children( array( 
         'post_type'    => 'attachment'
        ,'post_parent'  => $post_ID
    ) );

    // Bulk updating attached file names
    foreach ( $attachments as $att )
    {
        $att_ID     = $att->ID;
        // Append attachment ID (collision safety)
        // Also allows sorting files by post & then attchment ID
        $new_name   = "{$new_file_name}-{$att_ID}";

        $mime_type  = explode( "/", get_post_mime_type( $att->ID ) );
        $file_type  = $mime_type[0];
        $mime_type  = $mime_type[1];

        // Skip file types we don't want to change
        if ( ! in_array( $file_type, $allowed_types ) )
            continue;
        // Skip mime types we don't want to change
        if ( ! in_array( $mime_type, $allowed_ext ) )
            continue;

        // Get current file info
        $file_path = get_attached_file( $att->ID );
        $path   = pathinfo( $file_path );
        $dir    = trailingslashit( $path['dirname'] );
        $ext    = $path['extension'];

        // Build final name
        $final  = "{$dir}{$new_name}.{$ext}";

        // Skip if the path was already changed on upload
        // If we don't set this, the function wouldn't work for older files
        if ( $file_path == $final )
            continue;

        // Update attachment-post meta info for file
        rename( $file_path, $final );
        update_attached_file( $att_ID, $final );
    }

    return;
}
add_action( 'add_attachment', 'wpse30313_update_attachment_names' );
add_action( 'edit_attachment', 'wpse30313_update_attachment_names' );

该功能应添加到您的functions.php文件中,或者(最好)作为一个单独的小插件添加。只需在顶部添加一个插件注释,然后将其上传到plugins文件夹并激活即可。


感谢您的详细答复,我运行了代码,它似乎可以执行,但是我不确定它是否更改了任何内容。是否应该更改附件对象的post_name或guid?
罗伯特·辛克莱

3

我会使用PHP rename和所给文件的路径get_attached_file

function rename_file( $post_id, $newname ) {
    $file = get_attached_file( $post_id );
    rename($file,dirname($file).$newname)
}

注意,这尚未经过测试,在处理文件时应格外小心。它可能需要更改才能正常工作,但可能是一个很好的起点。希望这可以帮助。

让我知道是否有帮助,然后将代码更改为实际的工作代码。


1
这会中断WordPress到文件的链接,因为WordPress无法理解已经发生了重命名。
Annika Backstrom

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.