In a function fired from filter wp_handle_upload_prefilter
, how can I utilise a variable obtained from previously firing action edit_user_profile
?
我的目标:开启
user-edit.php
, 当用户上载文件(ACF图像)时,获取表单主题用户的用户名(不是当前用户),并使用该用户名重命名文件。
我目前的想法:
使用edit_user_profile
, 编辑用户加载时,将ID捕获到变量。
将其馈送到wp_handle_upload_prefilter
, 它进行文件重命名,以便生成所需的文件名字符串。
但是,我无法以不在媒体选择器模式中引发错误的方式使其正常工作。
选项?:
我不确定我是否使用global
s是正确的。我更喜欢这种方法,因为它看起来最简单。
匿名函数和使用use
?
当上传预过滤器可能关注Ajax模式时,我推断我可以通过这种方式传递它们,这是完全错误的吗?我假设传递变量仍然可以。顺序重要吗?
$myuserid = 5; // global scope - set 5 just to test flow
// 1b. WHEN EDIT-USER.PHP LOADS, CAPTURE USER_ID
function custom_user_profile_fields( $profileuser ) {
$myuserid = $_GET[\'user_id\'];
echo \'<h1>Foo We are Setting $myuserid to \'.$myuserid.\'</h1>\';
}
// add_action( \'show_user_profile\', \'custom_user_profile_fields\' );
add_action( \'edit_user_profile\', \'custom_user_profile_fields\' );
// 2. WHEN TAKING AN UPLOAD, USE USER_ID TO GET OUR DATA & RENAME FILE
// Filter entry, cf. https://wordpress.stackexchange.com/questions/168790/how-to-get-profile-user-id-when-uploading-image-via-media-uploader-on-profile-pa
// p1: filter, p2: function to execute, p3: priority eg 10, p4: number of arguments eg 2
add_filter(\'wp_handle_upload_prefilter\', \'my_pre_upload\', 2, 1);
function my_pre_upload($file, $myuserid){ // was function my_pre_upload($file, $myuserid) with 2 arguments{
$user = get_userdata( $myuserid );
// Renaming, cf. https://stackoverflow.com/a/3261107/1375163
$info = pathinfo($file[\'name\']);
$ext = empty($info[\'extension\']) ? \'\' : \'.\' . $info[\'extension\'];
$name = basename($file[\'name\'], $ext);
$file[\'name\'] = $user->user_login . $ext;
// Carry on
return $file;
}
最合适的回答,由SO网友:Jacob Peattie 整理而成
我不确定我对globals的使用是否正确。我更喜欢这种方法,因为它看起来最简单。
事实并非如此。
问题是wp_handle_upload_prefilter
在完全独立的AJAX请求中发生。它无法访问用户编辑中定义的任何PHP变量(全局或其他)。php。
如果按照您的方式将值硬编码到文件中,那么它会工作,但这只是因为文件是为两个请求加载的。如果在一个钩子中重新定义值,另一个钩子中的值仍然是原始值,因为重新分配发生在单独的请求中。
此外,这也行不通:
$myuserid = 5;
function my_pre_upload($file, $myuserid){}
my_pre_upload()
将仅接收筛选器传递的参数。和
wp_handle_upload_prefilter
仅传递了一个参数,用于文件信息。
传递数据的唯一方法user-edit.php
到wp_handle_upload_prefilter
就是以某种方式修改上传的AJAX请求,以包含所需的数据。然后您可以使用$_POST
.
好消息是有一个过滤器,plupload_default_params
, 这将允许您为媒体上传的AJAX请求添加参数。因此,在这个过滤器中,检查您是否在用户编辑屏幕或配置文件屏幕上,如果是,请将用户ID添加到参数中。
add_filter( \'plupload_default_params\', function( $params ) {
if ( ! is_admin() ) {
return $params;
}
$screen_id = get_current_screen();
if ( \'user-edit\' === $screen_id ) {
$params[\'user_id\'] = $_GET[\'user_id\'];
} else if ( \'profile\' === $screen_id ) {
$params[\'user_id\'] = get_current_user_id();
}
return $params;
} );
然后,在你的
wp_handle_upload_prefilter
回调,检查此值并执行以下操作:
add_filter( \'wp_handle_upload_prefilter\', function( $file ) {
if ( isset( $_POST[\'user_id\'] ) ) {
$user_id = $_POST[\'user_id\'];
// Do what you want with the user.
}
return $file;
} );