根据用户名

时间:2018-04-18 18:22:11

标签: wordpress file-upload xml-rpc

我在这方面搜索了所有相关的问题,但是我被卡住了,因为它们都没有解决通过XML RPC上传的特殊情况。

我想有条件地更改Wordpress文件上传目录,只有当文件通过XML RPC调用进入时,并且只有当来自特定用户的调用时才会进入。

我的方法基于this Answer, this AnswerCodex的组合。

这是我没有运气的尝试:

    add_filter( 'xmlrpc_methods', 'call_intercept1' );
    function call_intercept1( $methods ) {

    $methods[ 'metaWeblog.newMediaObject' ] = 'custom_upload1';

    return $methods;}

function custom_upload1( $args ) {
    global $wpdb;

        $username = $this->escape( $args[1] );
        $password = $this->escape( $args[2] );
        $data     = $args[3];

        $name = sanitize_file_name( $data['name'] );
        $type = $data['type'];
        $bits = $data['bits'];

    if ( !$user = $this->login($username, $password) )
            return $this->error;

    if ( $username = "XXX" ) {
    add_filter('upload_dir', 'custom_upload_dir1');

}
$upload = wp_upload_bits($name, null, $bits);
        if ( ! empty($upload['error']) ) {
            /* translators: 1: file name, 2: error message */
            $errorString = sprintf( __( 'Could not write file %1$s (%2$s).' ), $name, $upload['error'] );
            return new IXR_Error( 500, $errorString );
            }
    return $upload;
}

function custom_upload_dir1( $param ){
    $custom_dir = '/the-desired-directory';

    $param['path'] = $param['path'] . $custom_dir;
    $param['url'] = $param['url'] . $custom_dir;

    error_log("path={$param['path']}");  
    error_log("url={$param['url']}");
    error_log("subdir={$param['subdir']}");
    error_log("basedir={$param['basedir']}");
    error_log("baseurl={$param['baseurl']}");
    error_log("error={$param['error']}"); 

    return $param;
}

正在正确上传文件,但没有发生条件目录更改。

有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

我能够解决这个问题,主要是使用Ulf B的Custom Upload Dir作为模型并从那里简化它。

对于遇到同样问题的其他人来说,这是有效的:

    // XMLRPC Conditional Upload Directory
    add_action('xmlrpc_call', 'redirect_xmlrpc_call'); 

    function redirect_xmlrpc_call($call){
        if($call !== 'metaWeblog.newMediaObject'){return;}      
        global $wp_xmlrpc_server; 
        $username = $wp_xmlrpc_server->message->params[1];
        $data = $wp_xmlrpc_server->message->params[3];
        if($username !== "XXX"){return;}
        else {custom_pre_upload($data);}}

    function custom_pre_upload($data){  
        add_filter('upload_dir', 'custom_upload_dir');
        return $data;}

    function custom_post_upload($fileinfo){ 
        remove_filter('upload_dir', 'custom_upload_dir');
        return $fileinfo;}

    function custom_upload_dir($path){      
        if(!empty($path['error'])) { return $path; } //error; do nothing.   
        $customdir = '/' . 'your-directory-name';   
        $path['subdir']  = $customdir;
        $path['path']   .= $customdir; 
        $path['url']    .= $customdir;  
        return $path;}