问题描述

是否有一个功能允许我根据附件 ID 更改附件的文件名?

谢谢!丹尼斯

最佳解决方法

这将允许您在附件上传时重命名附件:

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

    $post = get_post($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 );

}

次佳解决方法

用例

该功能适用​​于

  • 添加文件

  • 更新文件 (是,也是已存在的文件)

  • 多个文件

No-Use 病例

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

Goodies

您可以设置文件名,文件类型&在 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 文件夹并激活。

第三种解决方法

我会使用 PHP 的 rename 和由 get_attached_file 给出的文件的路径。

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

注意,这没有被测试,你应该在使用文件时极端的预防措施。它可能需要改变才能工作,但可能是一个很好的起点。希望这可以帮助。

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

第四种方法

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

    $post = get_post($post_ID);
    $file = get_attached_file($post_ID);
    $path = pathinfo($file);
    $newfilename = "mynewfilename";
    $newfile = $path['dirname']."/".$newfilename.".".$path['extension'];

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

}

参考文献 http://codex.wordpress.org/Function_Reference/update_attached_file http://wordpress.org/tags/add_attachment

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。