按MIME类型更改上载URL

时间:2019-06-07 作者:jla

我在一个网站上工作,在几个月的时间里上传了数百个pdf文件。所有上传都按年/月组织在上传目录中。

客户刚刚决定,他们不想在pdf URL中显示日期。而不是URLsite.com/app/uploads/2019/06/whatever.pdf 他们想要urlsite.com/app/uploads/pdf/whatever.pdf. 请注意,这仅适用于pdf文件。

对于新上传,这很容易。我为添加了筛选器wp_handle_upload_prefilter 检查扩展名是否为pdf,并将上载目录更改为uploads/pdf 照着但是,我不知道如何更改所有现有PDF的URL。

我考虑将所有PDF移到uploads/pdf 目录,然后修改wp_posts 用于反映新位置的GUID字段

UPDATE
  `wp_posts`
SET
  guid = CONCAT(
    SUBSTRING_INDEX(guid, \'/uploads\', 1),
    \'/uploads/pdf/\',
    SUBSTRING_INDEX(guid, \'/\', -1)
  )
WHERE
  post_mime_type = \'application/pdf\'
。。但这不起作用。(在试验现场完成)。GUID已更改,但URL保持不变。

如何更新所有pdf上传的URL而不修改任何其他上传类型的URL?

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

结果表明,指向PDF在磁盘上的位置的值存储在wp_postmeta 表,位于meta_value 领域

例如,位于site.com/app/uploads/2019/06/whatever.pdf 会有一个meta_value 的值2019/06/whatever.pdf. 要更改所有PDF的位置,我首先找到了所有PDF的ID(从wp_posts 表,选择位置post_mime_type=\'application/pdf) 然后,对于每个ID,在wp_postmeta 表使用post_id 列并更新了该行的meta_value 字段,替换year/month/ 具有pdf/.

我使用了一个PHP脚本:

$ids = $wpdb->get_results( "SELECT * FROM `wp_posts` WHERE post_mime_type=\'application/pdf\'" );
foreach ( $ids as $id ) {
    $pdf = $wpdb->get_results( "SELECT * FROM `wp_postmeta` WHERE post_id=$id->ID" );
    $oldpdf = $pdf[0]->meta_value;

    $_tmp = explode("/",  $pdf[0]->meta_value);
    if ( sizeof($_tmp) > 2 ) {
        unset( $_tmp[0], $_tmp[1] );
        $newpdf = \'pdf/\'.implode("/", $_tmp);
    }
    else {
      $newpdf = $oldpdf;
    }

    if ( $oldpdf != $newpdf ) {
        rename( wp_get_upload_dir()[\'basedir\'].\'/\'.$oldpdf, wp_get_upload_dir()[\'basedir\'].\'/\'.$newpdf );
        $wpdb->update(
            \'wp_postmeta\',
            [ \'meta_value\' => $newpdf ],
            [ \'post_id\' => $id->ID ]
        );
    }
}