@prefix sioc: <http://rdfs.org/sioc/ns#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix content: <http://purl.org/rss/1.0/modules/content/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

<https://lhero.org/?post_type=lh-portfolio&#038;p=152640>
  a sioc:Post ;
  dc:title "LH Private Uploads" ;
  dcterms:identifier 152640 ;
  dc:modified "2026-10-27T12:45:19Z"^^xsd:dateTime ;
  dc:created "2026-10-27T12:45:19Z"^^xsd:dateTime ;
  sioc:link <https://lhero.org/portfolio/lh-private-uploads/> ;
  sioc:has_creator <https://lhero.org/author/1/#account> ;
  sioc:has_container <https://lhero.org/#posts> ;
  content:encoded "<ul class=\"lh_portfolio-meta\"><li><strong>Type:</strong> Plugin</li><li><strong>Lifecycle Stage:</strong> Active</li></ul><p class=\"wp-block-paragraph\">LH Private Uploads keeps private files private. WordPress normally leaves every upload in the public uploads directory, so the file behind a private post or attachment can still be fetched by anyone who has, or guesses, its URL. This plugin moves those files into a directory outside the web root and serves them through WordPress, checking who is asking before a single byte is sent.</p><h2 class=\"wp-block-heading\">How it works</h2><ul class=\"wp-block-list\"><li><strong>Status decides location.</strong> When an attachment, or the post it is attached to, becomes private or password protected, the file and all its image sizes move to the private directory. When it becomes public again, they move back. Other statuses can be added with the <code>lh_private_uploads_protected_statuses</code> filter.</li><li><strong>Files are served through a proxy.</strong> Protected files get a <code>/protected-files/</code> URL. Each request is matched to its attachment and checked before the file is streamed, with X-Sendfile support for large files.</li><li><strong>Access is default deny and filterable.</strong> Out of the box, editors, the file&#8217;s uploader and the author of the post it belongs to can open a private file, and password-protected files show a password form. Other plugins grant access through the <code>lh_private_uploads_user_can_access</code> filter.</li><li><strong>Built for multisite.</strong> Each site keeps its private files in its own directory, mirroring the public uploads layout, and a site only ever serves its own files. Files are never overwritten when they move.</li></ul><p class=\"wp-block-paragraph\">The private directory defaults to <code>private-uploads</code> one level above the WordPress root and can be set with the <code>LH_PRIVATE_UPLOADS_DIR</code> constant. There are no settings to configure.</p><ul class=\"lh_portfolio-doc-toc\"><li><a href=\"https://lhero.org/portfolio/lh-private-uploads/architecture/\">Architecture</a></li><li><a href=\"https://lhero.org/portfolio/lh-private-uploads/changelog/\">Changelog</a></li></ul>"^^rdf:XMLLiteral ;
  sioc:content "Type: PluginLifecycle Stage: ActiveLH Private Uploads keeps private files private. WordPress normally leaves every upload in the public uploads directory, so the file behind a private post or attachment can still be fetched by anyone who has, or guesses, its URL. This plugin moves those files into a directory outside the web root and serves them through WordPress, checking who is asking before a single byte is sent.How it worksStatus decides location. When an attachment, or the post it is attached to, becomes private or password protected, the file and all its image sizes move to the private directory. When it becomes public again, they move back. Other statuses can be added with the lh_private_uploads_protected_statuses filter.Files are served through a proxy. Protected files get a /protected-files/ URL. Each request is matched to its attachment and checked before the file is streamed, with X-Sendfile support for large files.Access is default deny and filterable. Out of the box, editors, the file&#8217;s uploader and the author of the post it belongs to can open a private file, and password-protected files show a password form. Other plugins grant access through the lh_private_uploads_user_can_access filter.Built for multisite. Each site keeps its private files in its own directory, mirroring the public uploads layout, and a site only ever serves its own files. Files are never overwritten when they move.The private directory defaults to private-uploads one level above the WordPress root and can be set with the LH_PRIVATE_UPLOADS_DIR constant. There are no settings to configure.ArchitectureChangelog" ;
  sioc:topic <https://lhero.org/lh_portfolio-type/plugin/>, <https://lhero.org/lh_portfolio-lifecycle-stage/active/>, <https://lhero.org/?taxonomy=lh_portfolio-tags&term=multisite>, <https://lhero.org/?taxonomy=lh_portfolio-tags&term=media>, <https://lhero.org/?taxonomy=lh_portfolio-tags&term=attachments>, <https://lhero.org/?taxonomy=lh_portfolio-tags&term=private-files>, <https://lhero.org/?taxonomy=lh_portfolio-tags&term=uploads>, <https://lhero.org/?taxonomy=author&term=cap-1> .

<https://lhero.org/author/1/#account> rdfs:seeAlso <https://lhero.org/author/1/?feed=lhrdf&format=turtle> .
<https://lhero.org/lh_portfolio-type/plugin/> rdfs:seeAlso <https://lhero.org/lh_portfolio-type/plugin/?feed=lhrdf&format=turtle> .
<https://lhero.org/lh_portfolio-lifecycle-stage/active/> rdfs:seeAlso <https://lhero.org/lh_portfolio-lifecycle-stage/active/?feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=lh_portfolio-tags&term=multisite> rdfs:seeAlso <https://lhero.org/?taxonomy=lh_portfolio-tags&term=multisite&feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=lh_portfolio-tags&term=media> rdfs:seeAlso <https://lhero.org/?taxonomy=lh_portfolio-tags&term=media&feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=lh_portfolio-tags&term=attachments> rdfs:seeAlso <https://lhero.org/?taxonomy=lh_portfolio-tags&term=attachments&feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=lh_portfolio-tags&term=private-files> rdfs:seeAlso <https://lhero.org/?taxonomy=lh_portfolio-tags&term=private-files&feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=lh_portfolio-tags&term=uploads> rdfs:seeAlso <https://lhero.org/?taxonomy=lh_portfolio-tags&term=uploads&feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=author&term=cap-1> rdfs:seeAlso <https://lhero.org/?taxonomy=author&term=cap-1&feed=lhrdf&format=turtle> .
