在自定义插件的这个特定页面上,我试图更改上传目录的路径。该页面是一个标准的php页面,而不是任何特定类型的post类型页面。
我已经找到了许多文章来解释这个过程,我可以看到如果这是一个自定义的帖子类型,它将如何工作,但如果不是这样的话,示例就不能按预期工作。
我的自定义页面的URL如下所示:http://localhost/custom-plugin/wp-admin/admin.php?page=custom-plugin-page&id=1
.
$\\u POST变量是动态的,取决于用户正在编辑的项目。
我遇到了以下问题,并根据自己的需要进行了调整:
function edd_load_upload_filter() {
global $pagenow;
if ( ! empty( $_POST[\'page\'] ) && $_POST[\'page\'] == \'custom-plugin-page\' && ( \'async-upload.php\' == $pagenow || \'media-upload.php\' == $pagenow ) ) {
add_filter( \'upload_dir\', \'edd_set_upload_dir\' );
}
}
add_action(\'admin_init\', \'edd_load_upload_filter\');
function edd_set_upload_dir($upload) {
$upload[\'subdir\'] = \'/edd\' . $upload[\'subdir\'];
$upload[\'path\'] = $upload[\'basedir\'] . $upload[\'subdir\'];
$upload[\'url\'] = $upload[\'baseurl\'] . $upload[\'subdir\'];
return $upload;
}
但正如您所看到的,该函数正在检查post类型是否为“download”。
据我所知,在初始页面加载时,$\\u POST变量不是空的,但当打开媒体模式时,它是空的。由于它在媒体模式中返回为空,因此无法正确设置上载目录的路径。如果我删除!empty( $_POST[
page\'] );
检查路径是否正确调整,然后在整个站点上进行调整,而不仅仅是在我的自定义页面上。
不知道为什么网络上的示例都使用一些$\\u POST或$\\u REQUEST变量,但当我使用它时,它是空的,所以我的函数永远不会启动。有什么想法吗?
最合适的回答,由SO网友:EHerman 整理而成
在处理了一段时间并检查了GLOBALS变量是否有任何有用的内容后,看起来媒体模式中的引用URL与我的自定义插件页面的URL相同。
使用它并将其拆分一点,我能够确认我在适当的页面上。我确信还有其他更优雅的解决方案,但这就是我能够想到的。我已经测试过了,它似乎工作正常。
这是我的最终解决方案:
add_filter( \'admin_init\' , \'check_if_we_should_change_upload_dir\', 999 );
function check_if_we_should_change_upload_dir() {
global $pagenow;
$referrer = isset( $_SERVER[\'HTTP_REFERER\'] ) ? $_SERVER[\'HTTP_REFERER\'] : \'\';
if( $referrer != \'\' ) {
$explode_1 = explode( \'page=\' , $referrer );
if( isset( $explode_1[1] ) ) {
$referring_page = explode( \'&id=\' , $explode_1[1] );
if( isset( $referring_page[0] ) && $referring_page[0] == \'custom-plugin-page\' && ( \'async-upload.php\' == $pagenow || \'media-upload.php\' == $pagenow ) ) {
add_filter( \'upload_dir\', \'alter_the_upload_dir\' );
}
}
}
}
function alter_the_upload_dir( $upload ) {
$upload[\'subdir\'] = \'/custom-directory\' . $upload[\'subdir\'];
$upload[\'path\'] = $upload[\'basedir\'] . $upload[\'subdir\'];
$upload[\'url\'] = $upload[\'baseurl\'] . $upload[\'subdir\'];
return $upload;
}
如果有人有更好的检查方法,我洗耳恭听!
埃文