web-dev-qa-db-ja.com

メディアマネージャーに同じ名前のファイルを強制的に上書きされる方法は?

私は私のテーマで動作するウィジェットを持っていて、それはある意味で名前が付けられた画像を期待しています、slide1.png、slide2.png、等。

しかし、ユーザーが独自の画像をslide1.png、slide2.pngなどの名前でメディアライブラリにアップロードすると、画像を新しい画像で更新するのではなく、WordPressは置き換え画像の名前をslide11.png、slide22に変更します。 PNGなど

ファイル名を変更せずに既存の画像を上書きするようにWPに指示するフィルタをテーマオプションに設定できますか?

3
N2Mystic

これは私が作ったもので、主にプラグイン Overwrite Uploads から取ったものですが、余分なものはありません。

add_filter('wp_handle_upload_overrides','noneUniqueFilename');
function noneUniqueFilename($overrides){
    $overrides['test_form'] = false;
    $overrides['unique_filename_callback'] = 'nonUniqueFilenameCallback';
    return $overrides;
}

function nonUniqueFilenameCallback($directory, $name, $extension){
    $filename = $name . strtolower($extension);
    //remove old attachment
    removeOldAttach($filename);

    return $filename;
}

function removeOldAttach($filename){
    $arguments = array(
        'numberposts'   => -1,
        'meta_key'      => '_wp_attached_file',
        'meta_value'    => $filename,
        'post_type'     => 'attachment'
    );
    $Attachments_to_remove = get_posts($arguments);

    foreach($Attachments_to_remove as $a)
        wp_delete_attachment($a->ID, true);
}
3
Bainternet

コアをハックすることなく、@ Bainternet's Answerを使ってこの作業を成功させました。

この他のQ&Aも役に立ちました。 query_posts:特定の単語を含むすべての「meta_value」を表示する方法

wp_unique_filename 関数の先頭にフィルタsanitize_file_nameがあるので、そこでフックして重複した添付ファイルのチェックと削除を行うことができます。

私は基本的なlocalhostのテストをしました。ライブサイトに申し込む前に徹底的にテストしてください。

add_filter( 'sanitize_file_name', 'filename_filter_wpse_28439', 10, 1 );

function filename_filter_wpse_28439( $name ) 
{
    $args = array(
        'numberposts'   => -1,
        'post_type'     => 'attachment',
        'meta_query' => array(
                array( 
                    'key' => '_wp_attached_file',
                    'value' => $name,
                    'compare' => 'LIKE'
                )
            )
    );
    $attachments_to_remove = get_posts( $args );

    foreach( $attachments_to_remove as $attach )
        wp_delete_attachment( $attach->ID, true );

    return $name;
}
0
brasofilo