WordPress用户配置文件上传-如果页面已保存,则重置文件

时间:2012-06-02 作者:Storm3y

我在函数中设置了各种不同的额外配置文件字段。php然而,如果用户上载图像并保存图像设置的表单,则使用上载,但是如果用户返回并编辑另一个字段,则会将图像字段设置为null。

这是我函数中的代码。php文件。任何帮助都将不胜感激。

     <?php

add_action( \'show_user_profile\', \'extra_user_profile_fields\' );
add_action( \'edit_user_profile\', \'extra_user_profile_fields\' );

function extra_user_profile_fields( $user ) { 

$r = get_user_meta( $user->ID, \'picture\', true );
    ?>


<!-- Artist Photo Gallery -->
<h3><?php _e("Public Profile - Gallery", "blank"); ?></h3>

<table class="form-table">

<tr>
        <th scope="row">Picture</th>
        <td><input type="file" name="picture" value="" />

            <?php //print_r($r); 
                if (!isset($r[\'error\'])) {
                    $r = $r[\'url\'];
                    echo "<img src=\'$r\' />";
                } else {
                    $r = $r[\'error\'];
                    echo $r;
                }
            ?>
        </td>
    </tr>

</table> 



<?php
}

add_action( \'personal_options_update\', \'save_extra_user_profile_fields\' );
add_action( \'edit_user_profile_update\', \'save_extra_user_profile_fields\' );

function save_extra_user_profile_fields( $user_id ) {

if ( !current_user_can( \'edit_user\', $user_id ) ) { return false; }

$_POST[\'action\'] = \'wp_handle_upload\';
$r = wp_handle_upload( $_FILES[\'picture\'] );
update_user_meta( $user_id, \'picture\', $r, get_user_meta( $user_id, \'picture\', true ) );

}

}

add_action(\'user_edit_form_tag\', \'make_form_accept_uploads\');
function make_form_accept_uploads() {
    echo \' enctype="multipart/form-data"\';
}

2 个回复
最合适的回答,由SO网友:Johannes Pille 整理而成

的最后一个参数update_user_meta(), 上一个值是可选参数。如果设置了,它会检查数据库中的值是否确实是您输入的值update_user_meta(). 如果通过从数据库中获取值来设置该参数,则它是完全冗余的。因此,首先,忽略这一点。

也就是说,这就是解决覆盖问题的方法:

if( $_FILES[\'picture\'][\'error\'] === UPLOAD_ERR_OK ) {
    $upload_overrides = array( \'test_form\' => false ); // if you don’t pass \'test_form\' => FALSE the upload will be rejected
    $r = wp_handle_upload( $_FILES[\'picture\'], $upload_overrides );
    update_user_meta( $user_id, \'picture\', $r );
}
术语有点混乱,因为UPLOAD_ERR_OK 是一条状态消息,不是错误,但这是检查上载是否成功的方法。如果您将此作为保存元值的条件,那么就可以继续了。

有关$_FILES superglobal的错误或状态,请参阅Error Messages Explained from the PHP manual.

EDIT: How to get the URL of the uploaded image

此编辑符合此答案评论中的扩展问题。

$pic_data = get_user_meta( $curauth->ID, \'picture\', true );
$pic_url = $pic_data[\'url\'];
将URL保存到一个变量中,然后可以在任何地方回显。假设$curauth 是当前用户对象。您可以使用全局WordPress变量$current_user 相反,如果您已经有了对象,那么不妨这样做。

SO网友:Kundan Naik
// for file upload
add_action(\'user_edit_form_tag\', \'make_form_accept_uploads\');
function make_form_accept_uploads() {
    echo \' enctype="multipart/form-data"\';
}

function custom_user_profile_fields($user)
{
    if(is_object($user)) {
        $r = get_user_meta( $user->ID, \'portfolioimage\', true );
    } else {
        $r = null;
    }

    ?>
    ## Heading ##
    <table class="form-table">
        <h3>Portfolio</h3>
        <tr>
            <th><label for="image">Portfolio Image</label></th>
            <td>
                <?php 
                    if (!isset($r[\'error\'])) {
                        $r = $r[\'url\'];
                        echo "<img src=\'$r\' width=\'96\' hieght=\'96\'/>";
                    } else {
                        $r = $r[\'error\'];
                        echo $r;
                    }
                ?>
                <br/>
                <span class="description">Please upload an image for your profile.</span>
                <br/>
                <input type="file" class="button-primary" value="Upload Image" id="portfolioimage" name="portfolioimage" multiple/><br />
            </td>
        </tr>
    </table>    
    <?php
}

add_action( "show_user_profile", "custom_user_profile_fields" );
add_action( "edit_user_profile", "custom_user_profile_fields" );
add_action( "user_new_form", "custom_user_profile_fields" );
function save_custom_user_profile_fields($user_id)
{
# again do this only if you can
if(!current_user_can(\'manage_options\'))
    return false;

  if( $_FILES[\'portfolioimage\'][\'error\'] === UPLOAD_ERR_OK ) 
  {
    $upload_overrides = array( \'test_form\' => false ); 
    $r = wp_handle_upload( $_FILES[\'portfolioimage\'], $upload_overrides );
    update_user_meta( $user_id, \'portfolioimage\', $r );
  }
}

add_action(\'user_register\', \'save_custom_user_profile_fields\');
add_action(\'profile_update\', \'save_custom_user_profile_fields\');
结束