在上载过程中使用变量重命名文件

时间:2010-12-16 作者:pereyra

我想在上传过程中重命名文件,并将它们的名称设置为文件所附加到的后段代码,再加上一些随机字符(简单的递增计数器将很好地消除),以使文件名不同。

换句话说,如果我正在上传/附加图像到页面slug为“test page slug”的帖子,我希望这些图像能够动态重命名为test-page-slug-[C].[extension]:

测试第1页。jpg测试页-slug-2。jpg等等,不管原始文件名是什么Custom Upload Dir:

有了这个插件,您可以从其他变量构建路径,例如:帖子标题、ID、类别、帖子作者、帖子日期等等。

如何对文件名执行相同的操作?

1 个回复
最合适的回答,由SO网友:MathSmath 整理而成

您将希望连接到wp\\u handle\\u upload\\u prefilter过滤器(我找不到任何文档,但看起来很简单)。我在当地尝试过这个方法,它似乎对我有效:

function wpsx_5505_modify_uploaded_file_names($arr) {

    // Get the parent post ID, if there is one
    if( isset($_REQUEST[\'post_id\']) ) {
        $post_id = $_REQUEST[\'post_id\'];
    } else {
        $post_id = false;
    }

    // Only do this if we got the post ID--otherwise they\'re probably in
    //  the media section rather than uploading an image from a post.
    if($post_id && is_numeric($post_id)) {

        // Get the post slug
        $post_obj = get_post($post_id); 
        $post_slug = $post_obj->post_name;

        // If we found a slug
        if($post_slug) {

            $random_number = rand(10000,99999);
            $arr[\'name\'] = $post_slug . \'-\' . $random_number . \'.jpg\';

        }

    }

    return $arr;

}
add_filter(\'wp_handle_upload_prefilter\', \'wpsx_5505_modify_uploaded_file_names\', 1, 1);
在我的测试中,似乎只有启用了相当长的永久链接后,帖子才有一个slug,所以我添加了一个检查,以确保在重命名文件之前有一个slug。您还需要考虑检查文件类型,我在这里没有做这件事——我只是假设它是jpg。

EDIT

根据注释中的要求,此附加功能会更改上载图像的某些元属性。但似乎不允许您设置ALT文本,并且由于某种原因,您设置为“标题”的值实际上被指定为描述。你得胡闹。我在函数wp\\u read\\u image\\u metadata()中找到了此筛选器,该函数位于wp admin/includes/image中。php。媒体上载和wp\\u generate\\u attachment\\u元数据功能依赖于此从图像中提取元数据。如果你想了解更多,可以看看那里。

function wpsx_5505_modify_uploaded_file_meta($meta, $file, $sourceImageType) {

    // Get the parent post ID, if there is one
    if( isset($_REQUEST[\'post_id\']) ) {
        $post_id = $_REQUEST[\'post_id\'];
    } else {
        $post_id = false;
    }

    // Only do this if we got the post ID--otherwise they\'re probably in
    //  the media section rather than uploading an image from a post.
    if($post_id && is_numeric($post_id)) {

        // Get the post title
        $post_title = get_the_title($post_id);

        // If we found a title
        if($post_title) {

            $meta[\'title\'] = $post_title;
            $meta[\'caption\'] = $post_title;

        }

    }

    return $meta;

}
add_filter(\'wp_read_image_metadata\', \'wpsx_5505_modify_uploaded_file_meta\', 1, 3);

Edited 04/04/2012 to pull post ID from the REQUEST obj rather than checking the GET and POST successively. Based on suggestions in the comments.

结束

相关推荐

在不删除功能的情况下删除“slug”的Metabox

这里有一个有趣的问题。我最近注意到,如果您使用该代码remove_meta_box(\'slugdiv\', \'post\', \'normal\'); 当您单击页面标题下的url slug时,实际上无法修改slug。要澄清的是,当您为slugdiv使用remove\\u meta\\u框时,metabox和屏幕选项将被删除,但是您仍然可以单击文章标题下的url来编辑它。。。然而,当你去更新/发布帖子时,你所做的任何修改都不会生效。我的目标是从post edit屏幕中删除同一个metabox