{"id":335966,"date":"2026-07-23T19:35:48","date_gmt":"2026-07-23T19:35:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/custom-user-avatars\/"},"modified":"2026-08-03T15:26:50","modified_gmt":"2026-08-03T15:26:50","slug":"avatarly","status":"publish","type":"plugin","link":"https:\/\/hu.wordpress.org\/plugins\/avatarly\/","author":13995663,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.3","stable_tag":"1.0.3","tested":"7.0.4","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"Avatarly","header_author":"Saumya Sharma","header_description":"Let users upload and manage local custom avatars from the profile screen, a shortcode, a widget, or a Gutenberg block \u2014 with full styling controls and no reliance on Gravatar.","assets_banners_color":"4d7890","last_updated":"2026-08-03 15:26:50","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/avatarly\/","header_author_uri":"https:\/\/iamsaumya.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":184,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"saumya010","date":"2026-07-23 21:25:02"},"1.0.2":{"tag":"1.0.2","author":"saumya010","date":"2026-07-25 16:48:02"},"1.0.3":{"tag":"1.0.3","author":"saumya010","date":"2026-08-03 15:26:50"}},"upgrade_notice":{"1.0.3":"<p>Fixes avatar uploads not saving when an administrator edits another user&#039;s profile. Update recommended if you manage avatars for other users from wp-admin.<\/p>","1.0.2":"<p>Security hardening for the avatar uploads folder and REST endpoints. Update recommended.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3620463,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3620463,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3620463,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3620463,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3620463,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"avatarly\/avatar-upload":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"avatarly\/avatar-upload","title":"Avatarly","category":"widgets","icon":"id-alt","description":"Lets the logged-in user upload or remove their local avatar.","keywords":["avatar upload","avatar","profile picture","user photo","gravatar"],"textdomain":"avatarly","attributes":{"size":{"type":"number","default":96},"showDelete":{"type":"boolean","default":true}},"supports":{"html":false,"align":["left","center","right"],"spacing":{"margin":true,"padding":true}},"editorScript":"file:.\/index.js","style":"file:.\/style.css","render":"file:.\/render.php"}},"tagged_versions":["1.0.1","1.0.2","1.0.3"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Settings screen \u2014 General &amp; Permissions tab.","2":"Settings screen \u2014 Styling tab.","3":"Front-end avatar upload form (shortcode\/widget\/block).","4":"Avatarly block in the editor."}},"plugin_section":[],"plugin_tags":[129,127,7894,259,9246],"plugin_category":[44],"plugin_contributors":[91582],"plugin_business_model":[],"class_list":["post-335966","plugin","type-plugin","status-publish","hentry","plugin_tags-avatar","plugin_tags-gravatar","plugin_tags-profile-picture","plugin_tags-upload","plugin_tags-user-profile","plugin_category-discussion-and-community","plugin_contributors-saumya010","plugin_committers-saumya010"],"banners":{"banner":"https:\/\/ps.w.org\/avatarly\/assets\/banner-772x250.png?rev=3620463","banner_2x":"https:\/\/ps.w.org\/avatarly\/assets\/banner-1544x500.png?rev=3620463","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/avatarly\/assets\/icon.svg?rev=3620463","icon":"https:\/\/ps.w.org\/avatarly\/assets\/icon.svg?rev=3620463","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Avatarly adds a local, self-hosted avatar system to WordPress. Users can upload a profile picture directly on your site instead of relying on Gravatar, and site owners get full control over who's allowed to upload, how avatars look, and where uploads are permitted.<\/p>\n\n<p><strong>Three ways to let users manage their avatar on the front end:<\/strong><\/p>\n\n<ul>\n<li><strong>Shortcode<\/strong> \u2014 <code>[avatarly]<\/code><\/li>\n<li><strong>Widget<\/strong> \u2014 add the \"Avatarly (Legacy)\" widget to any sidebar (classic, non-block themes)<\/li>\n<li><strong>Gutenberg block<\/strong> \u2014 search for \"Avatarly\" in the block inserter<\/li>\n<\/ul>\n\n<p>Avatars can also always be managed from the standard WordPress <strong>Edit Profile<\/strong> screen.<\/p>\n\n<p><strong>Key features<\/strong><\/p>\n\n<ul>\n<li>Local avatar storage \u2014 no data sent to Gravatar unless you choose to keep it as a fallback.<\/li>\n<li>Drag-and-drop \/ AJAX upload on the front end (progressively enhanced; falls back to a normal form for no-JS visitors).<\/li>\n<li>Built-in crop and reposition popup: drag to pan and use the zoom slider to frame the shot before saving, or skip it to use the automatic center crop.<\/li>\n<li>Strict upload validation: real MIME\/extension checks, image verification, and file-size limits \u2014 not just a filename blacklist.<\/li>\n<li>Automatic EXIF\/GPS metadata stripping from uploaded images.<\/li>\n<li>Fine-grained permissions: restrict uploads by capability and\/or by specific roles.<\/li>\n<li>A dedicated <strong>Styling<\/strong> tab: size, shape (circle\/rounded\/square), border, shadow, accent color, and button text.<\/li>\n<li>Optional automatic cleanup of avatar files when a user account is deleted.<\/li>\n<li>Translation ready.<\/li>\n<\/ul>\n\n<h4>Developer hooks<\/h4>\n\n<ul>\n<li><code>avatarly_avatar_size<\/code> (filter) \u2014 change the avatar size used when generating a sized copy.<\/li>\n<li><code>avatarly_avatar_data<\/code> (filter) \u2014 filter the final avatar data array.<\/li>\n<li><code>avatarly_avatar_html<\/code> (filter) \u2014 filter the rendered <code>&lt;img&gt;<\/code> HTML.<\/li>\n<li><code>avatarly_avatar_uploaded<\/code> (action) \u2014 fires after a successful upload.<\/li>\n<li><code>avatarly_avatar_deleted<\/code> (action) \u2014 fires after an avatar is removed.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>avatarly<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install it through the Plugins screen directly.<\/li>\n<li>Activate the plugin through the \"Plugins\" screen in WordPress.<\/li>\n<li>Visit <strong>Settings \u2192 Avatarly<\/strong> to configure permissions and styling.<\/li>\n<li>Add the <code>[avatarly]<\/code> shortcode to a page, add the \"Avatarly (Legacy)\" widget to a sidebar, or insert the \"Avatarly\" block wherever logged-in users need to manage their avatar.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20replace%20gravatar%20entirely%3F\"><h3>Does this replace Gravatar entirely?<\/h3><\/dt>\n<dd><p>No, by default it layers on top: if a user hasn't uploaded a local avatar, WordPress falls back to Gravatar (or your configured default) as usual. You can disable that fallback in Settings \u2192 Avatarly \u2192 General &amp; Permissions.<\/p><\/dd>\n<dt id=\"what%20image%20types%20are%20supported%3F\"><h3>What image types are supported?<\/h3><\/dt>\n<dd><p>JPG, PNG, GIF, and WebP.<\/p><\/dd>\n<dt id=\"can%20i%20choose%20which%20part%20of%20my%20photo%20is%20used%3F\"><h3>Can I choose which part of my photo is used?<\/h3><\/dt>\n<dd><p>Yes. When you select or drop an image, a crop popup lets you drag to reposition and zoom before saving. Selecting \"Skip\" uploads the image with an automatic center crop instead.<\/p><\/dd>\n<dt id=\"can%20i%20restrict%20who%20is%20allowed%20to%20upload%20an%20avatar%3F\"><h3>Can I restrict who is allowed to upload an avatar?<\/h3><\/dt>\n<dd><p>Yes. Under Settings \u2192 Avatarly \u2192 General &amp; Permissions you can require the <code>upload_files<\/code> capability and\/or restrict uploads to specific roles.<\/p><\/dd>\n<dt id=\"where%20are%20avatar%20files%20stored%3F\"><h3>Where are avatar files stored?<\/h3><\/dt>\n<dd><p>In <code>wp-content\/uploads\/avatarly\/<\/code>, following WordPress's standard year\/month upload structure.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20avatar%20files%20if%20i%20delete%20a%20user%3F\"><h3>What happens to avatar files if I delete a user?<\/h3><\/dt>\n<dd><p>By default nothing is deleted automatically. You can enable automatic cleanup on user deletion in the General &amp; Permissions tab.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fixed the admin \"Edit User\" profile screen (e.g. an administrator uploading an avatar for another user) not saving a newly-selected avatar at all: the selected filename showed correctly in the field, but the page reloaded with no changes and no error. WordPress core's own user-profile form doesn't set <code>enctype=\"multipart\/form-data\"<\/code>, since core itself has no file upload there \u2014 without it, the browser can't actually send file data on submit. The form now correctly includes this attribute so avatar uploads on that screen work as expected.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Security hardening: the avatar uploads subfolder now writes its own .htaccess\/index.php to deny script execution as a defense-in-depth measure, and the upload\/delete REST endpoints are now rate-limited per user.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Removed the Custom CSS settings field. Per WordPress.org plugin guidelines, plugins may not let users save arbitrary custom CSS\/JS\/PHP; all supported styling (size, shape, border, shadow, accent color) is already exposed as dedicated controls in Settings \u2192 Avatarly \u2192 Styling.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release, including a crop\/reposition popup (drag to pan, zoom slider, skippable) for the front-end upload flow.<\/li>\n<\/ul>","raw_excerpt":"No Gravatar account required: let users upload and manage a local custom avatar via their profile, a shortcode, a widget, or a Gutenberg block.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/335966","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=335966"}],"author":[{"embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/saumya010"}],"wp:attachment":[{"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=335966"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=335966"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=335966"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=335966"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=335966"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=335966"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}