Змініть ім’я файлу вкладення


11

Чи є функція, яка дозволяє мені змінити ім'я файлу вкладеного файлу на основі ідентифікатора, який я маю?

Спасибі! Денніс

Відповіді:


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

хм, я отримую це перейменування (): http обгортка не підтримує перейменування
Bakaburg

Тут є друкарська помилка. Функцію слід викликати rename_attachment.
Avishai

Я думаю, що для ясності краще, якщо ви назвали $ post_ID як $ attach_ID або щось подібне, тому що його можна плутати з ідентифікатором батьківського допису, тоді як він повинен бути ідентифікатором вкладення. Хороший пришельник :)
Армандо

Зауважте, що це не змінює інструкцію щодо вкладених файлів, тому код, на який покладаються орієнтири для отримання, наприклад, джерела зображення, не працює. Хоча загалом кажучи, ви не повинні змінювати пост-інструкцію, але в цій ситуації може бути розумним також оновити інструкцію.
Армандо

4

Використовуйте випадки

Функція працює для

  • Додавання файлів
  • Оновлення файлів (так, також для файлів, які вже є)
  • Кілька файлів

Справи без використання

Він припиняє роботу із автоматичним збереженням, виконується Wordpress автоматично або якщо цільові типи файлів або типи mime не виконані.

Ласощі

Ви можете встановити ім'я файлу, типи файлів та типи mime, які потрібно змінити всередині функції перед foreachциклом. Файл отримує ідентифікатор публікації, а потім додається ідентифікатор вкладеного файлу, тому ви можете безпечно завантажувати та змінювати декілька файлів одночасно. Це також стосується впорядкування файлів за першим ідентифікатором публікації та (другим) ідентифікатором вкладення.

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' );

Цю функцію слід додати до файлу function.php або (краще) як окремий невеликий плагін. Просто додайте коментар плагіна зверху, завантажте його в папку плагінів та активуйте.


дякую за детальну відповідь, я запустив код, і він, здавалося, виконується, але я не впевнений, що він щось змінив. Чи слід змінювати ім’я посади чи настанову об’єкта вкладення?
Роберт Сінклер

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.