使用Heroku,需要有非Gravator化身,但不能存储在本地

时间:2012-10-06 作者:Sara Chipps

所以,我是PHP新手,如果可能的话,我希望用一个插件来实现这一点。

我们正在Heroku上托管,这意味着将本地图像上载到/上载将不起作用。我们需要能够从Amazon s3的主机上引用单个用户的头像(他们不需要自己上传,我们的作者数量有限)。我们需要一种方法来设置头像以查看我们的s3 URL。

是否有插件要求提供头像的URL而不是本地文件?

非常感谢。

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

为头像做所有繁重工作的功能是get_avatar. 这是一个pluggable function, 这意味着您可以用插件替换它。Get avatar还有一个方便的过滤器,您可以使用它以编程方式覆盖内容。因此,有几个选择:(1)完全替换get_avatar 这可能会产生意外的副作用,并破坏评论中的头像,(2)为作者头像设置自己的功能,(3)过滤get_avatar 为作者而写,为其他人而写。

无论哪种方式,它都是从向用户配置文件添加一个字段开始的,这样您就可以指定一个头像来完成此操作。

让我们从将所有内容包装到一个类开始。

<?php
WPSE67312_Avatars::init();

class WPSE67312_Avatars
{
    // we\'ll need a nonce key
    const NONCE = \'wpse67312_nonce\';

    // The meta key where the avatar URL is stored.
    const META_KEY = \'wpse67312_avatar\';

    /***** Singleton pattern to add hooks and such *****/

    private static $ins = null;

    public static function init()
    {
        add_action(\'plugins_loaded\', array(__CLASS__, \'instance\'));
    }

    public static function instance()
    {
        is_null(self::$ins) && self::$ins = new self;
        return self::$ins;
    }
}
你需要加入show_user_profileedit_user_profile. 第一个在您自己的配置文件中显示字段(作者也可以看到该字段),并且edit_user_profile 当您编辑其他用户时,将显示该字段。

这还添加了一个小助手函数来获取用户化身url。不言而喻:坚持nonce, 添加标题,并回显字段。

<?php
class WPSE67312_Avatars
{
    // snip snip

    /**
     * Helper to fetch avatar urls.
     *
     * @param   int $user_id The user ID for which to fetch the avatar
     * @uses    get_user_meta To fetch the avatar URL.
     * @return  string The avatar url
     */
    public static function get_avatar($user_id)
    {
        return get_user_meta($user_id, self::META_KEY, true);
    }

    /**
     * Constructor.  Where all the real actions get added.
     *
     * @uses    add_action
     * @uses    add_filter
     * @return  void
     */
    protected function __construct()
    {
        add_action(\'edit_user_profile\', array($this, \'field\'));
        add_action(\'show_user_profile\', array($this, \'field\'));
    }

    public function field($user)
    {
        // Might want to hide this from authors?
        // if(!current_user_can(\'manage_options\'))
        //      return;

        wp_nonce_field(self::NONCE . $user->ID, self::NONCE, false);
        echo \'<h4>\', esc_html__(\'Avatar URL\', \'wpse\'), \'</h4>\';
        printf(
            \'<input type="text" class="regular-text" id="%1$s" name="%1$s" value="%2$s" />\',
            esc_attr(self::META_KEY),
            esc_attr(self::get_avatar($user->ID))
        );
    }
}
然而,添加字段实际上并不能保存它。你需要加入edit_user_profile_update (保存您自己以外的配置文件时激发)和person_options_update (保存自己的配置文件时激发)。在挂钩函数中,我们检查nonce,检查以确保当前用户可以编辑数据,并使用update_user_meta 或使用删除它delete_user_meta.

<?php
class WPSE67312_Avatars
{
    // snip snip

    /**
     * Constructor.  Where all the real actions get added.
     *
     * @uses    add_action
     * @uses    add_filter
     * @return  void
     */
    protected function __construct()
    {
        add_action(\'edit_user_profile\', array($this, \'field\'));
        add_action(\'show_user_profile\', array($this, \'field\'));
        add_action(\'edit_user_profile_update\', array($this, \'save\'));
        add_action(\'personal_options_update\', array($this, \'save\'));
    }

    // snip snip

    public function save($user_id)
    {
        if(
            !isset($_POST[self::NONCE]) ||
            !wp_verify_nonce($_POST[self::NONCE], self::NONCE . $user_id)
        ) return; // nonce is no good, bail

        if(!current_user_can(\'edit_user\', $user_id))
            return; // current user can\'t edit this user, bail

        if(!empty($_POST[self::META_KEY]))
        {
            // we have data! save it!
            update_user_meta(
                $user_id, 
                self::META_KEY,
                esc_url_raw($_POST[self::META_KEY])
            );
        }
        else
        {
            // empty field, delete the old value
            delete_user_meta($user_id, self::META_KEY);
        }
    }
}
您可以直接在模板中使用上述内容(循环中的某个地方):

<?php
if($avt = WPSEWPSE67312_Avatars::get_avatar(get_the_author_meta(\'ID\')))
{
    printf(
        \'<img src="%1s$" alt="%2$s" title="%4$s" />\', 
        esc_url($avt), 
        esc_attr(get_the_author_meta(\'display_name\'))
    );
}
这有点乱。或者我们可以尝试用get_avatar:

<?php
class WPSE67312_Avatars
{
    // snip snip

    /**
     * Constructor.  Where all the real actions get added.
     *
     * @uses    add_action
     * @uses    add_filter
     * @return  void
     */
    protected function __construct()
    {
        add_action(\'edit_user_profile\', array($this, \'field\'));
        add_action(\'show_user_profile\', array($this, \'field\'));
        add_action(\'edit_user_profile_update\', array($this, \'save\'));
        add_action(\'personal_options_update\', array($this, \'save\'));
        add_filter(\'get_avatar\', array($this, \'filter_avatar\'), 10, 5);
    }

    // snip snip

    public function filter_avatar($avatar, $id_or_email, $size, $default, $alt)
    {
        // do the dance to get a user
        $id = false;
        if(is_numeric($id_or_email))
        {
            $id = $id_or_email;
        }
        elseif(is_object($id_or_email))
        {
            if(!empty($id_or_email->user_id))
                $id = $id_or_email->user_id; // comment
        }
        elseif($user = get_user_by(\'email\', $id_or_email))
        {
            $id = $user->ID;
        }

        if($id && ($avt = self::get_avatar($id)))
        {
            $avatar = sprintf(
                \'<img src="%1$s" alt="%2$s" title="%2$s" width="%3$s" />\',
                esc_url($avt),
                esc_attr($alt),
                esc_attr($size)
            );
        }

        return $avatar;
    }
}
理论上,上述内容应该让普通的化身保持独立,并在它们可用时使用您的自定义化身。它可能需要比我所能做的更多的测试。

这些都是,wrapped in a plugin.

SO网友:Adam

奇普斯!

您可以尝试过滤get_avatar 作用我们试试好吗?

步骤1

    function custom_avatar($gravatar, $id_or_email, $size, $default, $alt) {

        $avatar = get_the_author_meta(\'custom_avatar_url\');
        $alt = get_the_author_meta(\'display_name\'); 

        if ($avatar) {

        //retrieve avatar from URL found in \'custom_avatar_url\' user_meta field.
        $image = \'<img src="\'.$avatar.\'" width="\'.$size.\'" height="\'.$size.\'" alt="\'.$alt.\'" />\';

        } elseif ($gravatar) {

        //if no custom $avatar is set then return a [gravatar] if found
        $image = $gravatar; 

        } else {

        //if no $gravatar found, revert to default placeholder for user avatar
        $image = \'<img src="\'.$default.\'" width="\'.$size.\'" height="\'.$size.\'" alt="\'.$alt.\'" />\';

        }

        return $image;
    }
    add_filter(\'get_avatar\', \'custom_avatar\', 10, 5);
将上述内容放入您的功能中。php文件。

如何工作首先是我们的功能custom_avatar

检查我们的meta_key 已命名custom_avatar_url 其结果存储在我们的变量中$avatarFALSE 我们继续检查是否存在gravatar,如果这也是FALSE 然后我们回退到WordPress安装中保留的默认图像占位符。(您也可以将其更改为完全自定义的内容)/ul>如果您不想检查Gravatar 你不必!只需完全删除该条件检查

步骤2上述函数处理对指定的自定义图像URL的检索,但您也需要在某个地方指定该URL。

$avatar = get_the_author_meta(\'custom_avatar_url\');
指示将自定义图像URL存储为user_meta, 很像post_meta, 用户还可以将元信息附加到他们身上,用于各种目的,比如这个目的。

我们需要在用户配置文件页面上添加一个表单输入字段,因此将其放入您的函数中。php文件;

function custom_avatar( $user ) {

    $html  = \'<table class="form-table"><tbody>\';
    $html .= \'<th><label>External Avatar URL<label></th>\';
    $html .= \'<td><input type="text" name="custom_avatar_url" class="custom_avatar_url regular-text" value="\' . esc_attr( get_the_author_meta( \'custom_avatar_url\', $user->ID ) ) . \'" /></td>\';
    $html .= \'</tbody></table>\';
    echo $html;

}
add_action( \'show_user_profile\', \'custom_avatar\' );
add_action( \'edit_user_profile\', \'custom_avatar\' );

function save_custom_avatar_url( $user_id ) {

    update_usermeta( $user_id, \'custom_avatar_url\', $_POST[\'custom_avatar_url\'] );

}
add_action( \'personal_options_update\', \'save_custom_avatar_url\' );
add_action( \'edit_user_profile_update\', \'save_custom_avatar_url\' );

结果

enter image description here

如果你没有在阅读时进行复制和粘贴,

整个脚本作为一个整体(粘贴到functions.php文件中)

function custom_avatar($gravatar, $id_or_email, $size, $default, $alt) {

    $avatar = get_the_author_meta(\'custom_avatar_url\');
    $alt = get_the_author_meta(\'display_name\'); 

    if ($avatar) {

    //retrieve avatar from URL found in \'custom_avatar_url\' user_meta field.
    $image = \'<img src="\'.$avatar.\'" width="\'.$size.\'" height="\'.$size.\'" alt="\'.$alt.\'" />\';

    } elseif ($gravatar) {

    //if no custom $avatar is set then return a [gravatar] if found
    $image = $gravatar; 

    } else {

    //if no $gravatar found, revert to default placeholder for user avatar
    $image = \'<img src="\'.$default.\'" width="\'.$size.\'" height="\'.$size.\'" alt="\'.$alt.\'" />\';

    }

    return $image;
}
add_filter(\'get_avatar\', \'custom_avatar\', 10, 5);

function custom_avatar_input( $user ) {

    $html  = \'<table class="form-table"><tbody>\';
    $html .= \'<th><label>External Avatar URL<label></th>\';
    $html .= \'<td><input type="text" name="custom_avatar_url" class="custom_avatar_url regular-text" value="\' . esc_attr( get_the_author_meta( \'custom_avatar_url\', $user->ID ) ) . \'" /></td>\';
    $html .= \'</tbody></table>\';
    echo $html;

}
add_action( \'show_user_profile\', \'custom_avatar_input\' );
add_action( \'edit_user_profile\', \'custom_avatar_input\' );

function save_custom_avatar_url( $user_id ) {

    update_usermeta( $user_id, \'custom_avatar_url\', $_POST[\'custom_avatar_url\'] );

}
add_action( \'personal_options_update\', \'save_custom_avatar_url\' );
add_action( \'edit_user_profile_update\', \'save_custom_avatar_url\' );
注意变量,

  • $size
  • $default
  • $alt
。。。都是可选的。因此,如果您决定从中定义的函数参数中删除这些参数,

function custom_avatar($arg1, $arg2, $arg3, $arg4, $arg5) { ...
例如,

function custom_avatar($arg1, $arg2) { ...
然后您还需要删除$arg3, $arg4, $arg5 从函数本身的主体,并将过滤器的必需参数更改为,

add_filter(\'get_avatar\', \'custom_avatar\', 10, 5); //5 represents 5 function arguments

add_filter(\'get_avatar\', \'custom_avatar\', 10, 2); //2 represents 2 function arguments

结束