我在一个网站上工作,在几个月的时间里上传了数百个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?
最合适的回答,由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 ]
);
}
}