{"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-07-25T16:48:02","modified_gmt":"2026-07-25T16:48:02","slug":"avatarly","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/avatarly\/","author":13995663,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.2","stable_tag":"1.0.2","tested":"7.0.2","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-07-25 16:48:02","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":76,"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"}},"upgrade_notice":{"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"],"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.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:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/335966","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=335966"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/saumya010"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=335966"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=335966"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=335966"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=335966"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=335966"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=335966"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}