如何在筛选器/操作函数之间传递变量?

时间:2021-09-17 作者:Robert Andrews

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, 它进行文件重命名,以便生成所需的文件名字符串。

但是,我无法以不在媒体选择器模式中引发错误的方式使其正常工作。

enter image description here

选项?:

我不确定我是否使用globals是正确的。我更喜欢这种方法,因为它看起来最简单。

匿名函数和使用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;
    }

1 个回复
最合适的回答,由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.phpwp_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;
} );