添付ファイル名を変更


11

添付ファイルIDに基づいて、添付ファイルのファイル名を変更できる機能はありますか?

ありがとう!デニス

回答:


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と(2番目の)添付ファイル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ファイルに追加するか、別の小さなプラグインとして(より良い)追加する必要があります。プラグインのコメントを上部に追加し、それをプラグインフォルダーにアップロードしてアクティブ化するだけです。


詳細な返信ありがとうございます。コードを実行しましたが、実行されたようですが、何か変更されたかどうかはわかりません。添付オブジェクトのpost_nameまたはguidを変更する必要がありますか?
ロバート・シンクレア2017

3

PHP renameとで指定されたファイルへのパスを使用しますget_attached_file

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

これはテストされていませんので、whithファイルを操作する場合は十分に注意してください。機能させるにはおそらく変更が必要ですが、良い出発点になるかもしれません。お役に立てれば。

それが役立つかどうか教えてください。コードを実際に機能するコードに変更します。


1
WordPressはファイル名へのリンクを解除します。これは、WordPressが名前の変更が行われたことを理解できないためです。
Annika Backstrom

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.