{"id":3597,"date":"2019-02-08T12:21:15","date_gmt":"2019-02-08T06:51:15","guid":{"rendered":"https:\/\/pheonixsolutions.com\/blog\/?p=3597"},"modified":"2026-10-07T14:41:54","modified_gmt":"2026-10-07T09:11:54","slug":"allow-ftp-access-to-developers-for-wordpress-sites-2","status":"publish","type":"post","link":"https:\/\/pheonixsolutions.com\/blog\/allow-ftp-access-to-developers-for-wordpress-sites-2\/","title":{"rendered":"How to Allow FTP Access for Developers on WordPress Sites"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Post Date:<\/strong> February 07, 2019<br><strong>Last Updated:<\/strong> October 07, 2026<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress developers may sometimes face issues when uploading files through FTP or installing, updating, or deleting plugins from the WordPress admin dashboard.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">These issues are commonly caused by incorrect ownership or file and directory permissions on the WordPress installation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this guide, we will explain how to create a dedicated developer user, assign the appropriate web server group, and configure WordPress file ownership and permissions so that developers can work with the website without unnecessary permission-related issues.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before making these changes, make sure you have the following:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Server Access<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You need SSH access to the Linux server with root or sudo privileges.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">WordPress Installation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You should know the document root of the WordPress website.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/var\/www\/pheonixsolutions.com\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Web Server User and Group<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Identify the user and group used by your web server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common examples include:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apache\nwww-data\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can check the running web server processes to identify the appropriate user.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Important:<\/strong> The exact user and group depend on your operating system and web server configuration.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Implementation<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. Create a Dedicated Developer User<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create a separate Linux user for developers instead of sharing an existing server account.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo useradd devs\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Set a strong password:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo passwd devs\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Enter the password when prompted.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Using a dedicated account makes it easier to manage and revoke developer access when required.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Set the User&#8217;s Home Directory<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Set the WordPress document root as the developer user&#8217;s home directory:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo usermod -d \/var\/www\/pheonixsolutions.com devs\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Replace the path with the actual WordPress document root on your server.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Add the Developer User to the Web Server Group<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">First, identify the group used by the web server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, if the web server uses the <code>apache<\/code> group:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo usermod -aG apache devs\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On Debian or Ubuntu-based systems, the group may instead be <code>www-data<\/code>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo usermod -aG www-data devs\n<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Note:<\/strong> Use <code>-aG<\/code> instead of <code>-g<\/code> when adding the user to an additional group. This prevents accidentally replacing the user&#8217;s existing primary group.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">4. Change WordPress File Ownership<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Navigate to the WordPress document root:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cd \/var\/www\/pheonixsolutions.com\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Set the appropriate user and web server group as the ownership:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo chown -R devs:apache \/var\/www\/pheonixsolutions.com\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If your web server uses <code>www-data<\/code>, use:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo chown -R devs:www-data \/var\/www\/pheonixsolutions.com\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Replace <code>devs<\/code>, <code>apache<\/code>, and the document root with the values appropriate for your server.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. Set File Permissions<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Set permissions for WordPress files:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo find \/var\/www\/pheonixsolutions.com -type f -exec chmod 664 {} \\;\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Set permissions for WordPress directories:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo find \/var\/www\/pheonixsolutions.com -type d -exec chmod 775 {} \\;\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">These permissions allow the owner and group to modify files while maintaining separate permissions for other users.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6. Verify Ownership and Permissions<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Verify the ownership of the WordPress installation:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ls -la \/var\/www\/pheonixsolutions.com\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can also check specific files or directories:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ls -la \/var\/www\/pheonixsolutions.com\/wp-content\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Make sure the expected developer user and web server group are shown.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7. Test FTP Access<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">After completing the configuration, connect to the server using the developer&#8217;s FTP\/SFTP credentials and verify that the user can access the required WordPress directory.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Test common operations such as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uploading a file<\/li>\n\n\n\n<li>Modifying a file<\/li>\n\n\n\n<li>Creating a directory<\/li>\n\n\n\n<li>Uploading a plugin<\/li>\n\n\n\n<li>Updating a plugin<\/li>\n\n\n\n<li>Removing files when required<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Security Recommendation:<\/strong> Whenever possible, use <strong>SFTP over SSH instead of traditional FTP<\/strong>. SFTP encrypts credentials and data during transmission, whereas standard FTP does not provide encryption.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Providing developers with dedicated access to a WordPress installation requires properly configured user accounts, group membership, ownership, and file permissions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By creating a dedicated developer account and configuring the WordPress files with appropriate ownership and permissions, developers can perform required file operations and manage WordPress plugins without encountering common permission-related issues.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For production environments, avoid granting more access than necessary and prefer SFTP over unencrypted FTP.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently Asked Questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Why can&#8217;t developers upload files to WordPress?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Incorrect file ownership or permissions are common causes. The web server user, developer account, and WordPress file permissions need to be configured appropriately.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Should I create a separate Linux user for each developer?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. Creating separate accounts is generally better than sharing one account because access can be managed and revoked individually.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Should I use FTP or SFTP?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">SFTP is recommended because it encrypts the connection and protects credentials and transferred data.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What is the difference between <code>apache<\/code> and <code>www-data<\/code>?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">They are commonly used web server users or groups, depending on the Linux distribution and web server configuration. CentOS\/RHEL-based systems commonly use <code>apache<\/code>, while Debian\/Ubuntu systems commonly use <code>www-data<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why use <code>usermod -aG<\/code> instead of <code>usermod -g<\/code>?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>-aG<\/code> adds the user to a supplementary group without removing existing supplementary group memberships. Using <code>-g<\/code> changes the user&#8217;s primary group.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Are 664 and 775 suitable for every WordPress installation?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">They are commonly used permissions, but the correct permissions depend on the server architecture, deployment process, security requirements, and ownership model. Avoid applying broad permissions such as <code>777<\/code> simply to resolve permission problems.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Related Articles<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/pheonixsolutions.com\/blog\/how-to-deploy-wordpress-behind-a-reverse-proxy-on-cpanel-apache\/\">How to Deploy WordPress Behind a Reverse Proxy on cPanel\/Apache<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/pheonixsolutions.com\/blog\/how-to-install-recaptcha-in-wordpress\/\">How to Install reCAPTCHA in WordPress<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Need Help Managing WordPress Server Access?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Need help configuring secure developer access for your WordPress websites? Our team can assist with WordPress server configuration, SFTP access, Linux user and group management, file permissions, security hardening, troubleshooting, and ongoing server administration. Get in touch with our team <a href=\"https:\/\/pheonixsolutions.com\/contact?utm_source=chatgpt.com\">here<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Post Date: February 07, 2019Last Updated: October 07, 2026 Introduction WordPress developers may sometimes face issues when uploading files through [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1022],"tags":[185,167],"class_list":["post-3597","post","type-post","status-publish","format-standard","hentry","category-web-architecture","tag-ftp-2","tag-wordpress-2","psol-cat-web-architecture"],"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/phn2x7-W1","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/3597","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/comments?post=3597"}],"version-history":[{"count":1,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/3597\/revisions"}],"predecessor-version":[{"id":12159,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/3597\/revisions\/12159"}],"wp:attachment":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/media?parent=3597"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/categories?post=3597"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/tags?post=3597"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}