How can I restrict a users ability to edit a custom field
Unfortunately I don't think this is possible through the UI. As far as I know the ACLs for custom fields only have a combined view/edit permission - it's both, or nothing. Similarly I don't think it's possible to hide address data out of the box.

If you wanted to stop them viewing the custom fields altogether, you could turn off their access to custom data, then create ACLs for any custom fields you do want them to see:


Assign the users to a particular role within WordPress. By users, I mean the WordPress users - so the usernames they use to log into the website.
Go to WordPress Access Control and make sure they don't have the 'access all custom data' permission
Create a new group in Civi with the type 'Access Control'. Add the Civi record of all the above users to it (Each user login should have an associated record in Civi)
Go to 'Users and Permissions' -> 'Access Control' -> 'Manage Roles' and create a new role. For example, we have 'Office users', 'Home users' etc.
Go to 'Access Control' -> 'Assign Users to Roles' and assign the group from #3 to the role in #4. You could add multiple groups to this role if you wanted.
Go to 'Access Control' -> 'Manage ACLs' and add an ACL. Use the role from #4, the Operation 'Edit', the type of data 'A set of custom data fields', then select the appropriate custom fields.
Remember that these users will only be able to access the custom fields that you specifically allow them to on this screen. So you may need to create multiple ACLs, and create new ACLs when you create new custom fields in future.


It's probably worth playing around with ACLs just to check there's no way to set a view-only permission, just in case the functionality is there but the UI hasn't caught up.

It might be possible using permission hooks, though - I'll leave that for someone better informed than me.