{"id":291507,"date":"2026-04-12T14:53:59","date_gmt":"2026-04-12T14:53:59","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/immich-media-picker\/"},"modified":"2026-06-05T18:11:48","modified_gmt":"2026-06-05T18:11:48","slug":"media-picker-for-immich","status":"publish","type":"plugin","link":"https:\/\/mn.wordpress.org\/plugins\/media-picker-for-immich\/","author":263,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.2.0","stable_tag":"0.2.0","tested":"7.0","requires":"6.5","requires_php":"8.0","requires_plugins":null,"header_name":"Media Picker for Immich","header_author":"Donncha","header_description":"Use photos and videos from your Immich server in WordPress without copying files, or import them into the media library.","assets_banners_color":"","last_updated":"2026-06-05 18:11:48","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":10,"downloads":201,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.0":{"tag":"0.1.0","author":"donncha","date":"2026-04-12 14:54:42"},"0.2.0":{"tag":"0.2.0","author":"donncha","date":"2026-06-05 18:11:48"}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":{"immich\/album-gallery":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"immich\/album-gallery","title":"Immich Album Gallery","category":"media","icon":"format-gallery","description":"Embed a live Immich album as a gallery.","textdomain":"media-picker-for-immich","attributes":{"albumId":{"type":"string","default":""},"columns":{"type":"number","default":3},"imageSize":{"type":"string","default":"preview"},"sortOrder":{"type":"string","default":"default"},"limit":{"type":"number","default":0},"lightbox":{"type":"boolean","default":true},"showCaptions":{"type":"boolean","default":false},"showAlbumLink":{"type":"boolean","default":false}},"supports":{"html":false,"align":["wide","full"]},"usesContext":["postId"],"editorScript":"file:..\/..\/assets\/js\/immich-album-block.js","viewScript":"file:..\/..\/assets\/js\/immich-album-block-frontend.js","style":"file:..\/..\/assets\/css\/immich-album-block.css","render":"file:.\/render.php"}},"tagged_versions":["0.1.0","0.2.0"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3562641,"resolution":"1","location":"assets","locale":"","width":1297,"height":1150},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3562641,"resolution":"2","location":"assets","locale":"","width":724,"height":482}},"screenshots":{"1":"The Immich tab in the WordPress media picker, showing recent photos with search and people filter.","2":"The Immich settings page where you configure your server URL and API key."}},"plugin_section":[],"plugin_tags":[210,251971,84,205,40192],"plugin_category":[50],"plugin_contributors":[77609],"plugin_business_model":[],"class_list":["post-291507","plugin","type-plugin","status-publish","hentry","plugin_tags-gallery","plugin_tags-immich","plugin_tags-media","plugin_tags-photos","plugin_tags-self-hosted","plugin_category-media","plugin_contributors-donncha","plugin_committers-donncha"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/media-picker-for-immich.svg","icon_2x":false,"generated":true},"screenshots":[{"src":"https:\/\/ps.w.org\/media-picker-for-immich\/assets\/screenshot-1.jpg?rev=3562641","caption":"The Immich tab in the WordPress media picker, showing recent photos with search and people filter."},{"src":"https:\/\/ps.w.org\/media-picker-for-immich\/assets\/screenshot-2.jpg?rev=3562641","caption":"The Immich settings page where you configure your server URL and API key."}],"raw_content":"<!--section=description-->\n<p>Adds an \"Immich\" tab to the WordPress media picker modal and the Media Library grid view. Search and browse your self-hosted <a href=\"https:\/\/immich.app\/\">Immich<\/a> photo library, then import selected photos directly into WordPress or proxy them without copying files.<\/p>\n\n<p><strong>Features:<\/strong><\/p>\n\n<ul>\n<li><strong>Use or Copy<\/strong> \u2014 \"Use\" proxies media directly from Immich (no files copied); \"Copy\" downloads the original into the media library<\/li>\n<li><strong>Photo and video support<\/strong> \u2014 images are proxied with full-resolution originals; videos stream with seeking support<\/li>\n<li><strong>Smart search<\/strong> \u2014 find media using Immich's AI-powered search<\/li>\n<li><strong>People filter<\/strong> \u2014 browse by recognized people from your Immich library<\/li>\n<li><strong>Multi-select<\/strong> \u2014 use or import multiple items at once with infinite scroll<\/li>\n<li><strong>Lightbox<\/strong> \u2014 full-resolution lightbox on Immich images in posts<\/li>\n<li><strong>Media Library integration<\/strong> \u2014 browse and import Immich assets directly from the Media Library grid view<\/li>\n<li><strong>Previously added<\/strong> \u2014 the Immich tab shows assets you've already used, ready to re-select<\/li>\n<li><strong>Secure API proxy<\/strong> \u2014 all Immich API calls happen server-side; the API key is never exposed to the browser<\/li>\n<li><strong>Per-user API keys<\/strong> \u2014 each user can configure their own Immich API key<\/li>\n<li><strong>Local proxy cache<\/strong> \u2014 proxied media is cached on disk after the first request; optional automatic cleanup with configurable lifetime, managed from a Cache Files admin page<\/li>\n<li><strong>Copy Resolution setting<\/strong> \u2014 choose the resolution used when copying originals into the media library<\/li>\n<li><strong>Test Connection<\/strong> \u2014 verify your server URL and API key from the Settings page before saving<\/li>\n<\/ul>\n\n<p>This plugin also ships an \"Immich Album Gallery\" block: insert it in any post, pick an Immich album, and the post renders a live gallery of that album using the core Gallery markup (so it inherits your theme's styling and works with the WordPress core lightbox).<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to a self-hosted <a href=\"https:\/\/immich.app\/\">Immich<\/a> server that you configure in <strong>Settings &gt; Immich<\/strong>. Immich is a self-hosted photo and video management solution \u2014 it runs on your own infrastructure and is not a third-party cloud service, but the connection is disclosed here for transparency.<\/p>\n\n<h4>What data is sent and when<\/h4>\n\n<ul>\n<li><strong>Browsing and searching:<\/strong> When a logged-in WordPress user opens the Immich media picker or searches for photos, the plugin sends API requests (search queries, page numbers, and person filter IDs) to your Immich server.<\/li>\n<li><strong>Importing or using media:<\/strong> When a user selects an asset to import or use, the plugin fetches the original file or metadata from the Immich server using the asset's UUID.<\/li>\n<li><strong>Proxying media to visitors:<\/strong> When a site visitor views a page containing Immich-proxied images or videos, WordPress fetches the media from your Immich server on their behalf. Visitor data is not sent to Immich \u2014 only the stored asset UUID and your API key are used server-side.<\/li>\n<\/ul>\n\n<p>All communication uses the API key you configure in WordPress. The API key is never exposed to browsers.<\/p>\n\n<h4>Immich project links<\/h4>\n\n<ul>\n<li><a href=\"https:\/\/immich.app\/\">Immich website<\/a><\/li>\n<li><a href=\"https:\/\/immich.app\/privacy-policy\">Immich privacy policy<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/immich-app\/immich\/blob\/main\/LICENSE\">Immich license (AGPL-3.0)<\/a><\/li>\n<\/ul>\n\n<p>Since Immich is self-hosted, the terms of use and privacy practices are determined by whoever operates the Immich server you connect to.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>media-picker-for-immich<\/code> folder to <code>wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the \"Plugins\" menu in WordPress.<\/li>\n<li>Go to <strong>Settings &gt; Immich<\/strong> and enter your Immich server URL and API key.<\/li>\n<li>Generate an API key from the Immich web UI under <strong>Account Settings &gt; API Keys<\/strong>. The plugin needs only these permissions:\n\n<ul>\n<li><code>asset.read<\/code> \u2014 list asset metadata and run library searches.<\/li>\n<li><code>asset.view<\/code> \u2014 stream thumbnails and video playback through the proxy.<\/li>\n<li><code>asset.download<\/code> \u2014 fetch full-resolution originals for the proxy and the Copy\/import path.<\/li>\n<li><code>person.read<\/code> \u2014 populate the people filter dropdown and people thumbnails.<\/li>\n<li><code>album.read<\/code> \u2014 list albums in the picker and fetch their assets for the Album Gallery block.<\/li>\n<\/ul><\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20is%20immich%3F\"><h3>What is Immich?<\/h3><\/dt>\n<dd><p><a href=\"https:\/\/immich.app\/\">Immich<\/a> is a self-hosted photo and video management solution, similar to Google Photos. It runs on your own server and provides AI-powered search, facial recognition, and more.<\/p><\/dd>\n<dt id=\"what%20is%20the%20difference%20between%20%22use%22%20and%20%22copy%22%3F\"><h3>What is the difference between \"Use\" and \"Copy\"?<\/h3><\/dt>\n<dd><p><strong>Use Selected<\/strong> creates a virtual attachment that serves images and videos through your WordPress server as a proxy \u2014 no files are stored locally. This keeps your WordPress uploads directory lean.<\/p>\n\n<p><strong>Copy Selected<\/strong> downloads the full original file into <code>wp-content\/uploads\/<\/code> as a standard WordPress attachment. Use this when you want a local copy independent of your Immich server.<\/p><\/dd>\n<dt id=\"does%20my%20immich%20server%20need%20to%20be%20publicly%20accessible%3F\"><h3>Does my Immich server need to be publicly accessible?<\/h3><\/dt>\n<dd><p>Your Immich server must be accessible from your WordPress server, but it does not need to be publicly accessible on the internet. The plugin proxies all media through WordPress, so visitors never connect to Immich directly.<\/p><\/dd>\n<dt id=\"which%20immich%20api%20key%20permissions%20does%20the%20plugin%20need%3F\"><h3>Which Immich API key permissions does the plugin need?<\/h3><\/dt>\n<dd><p>Grant the API key these five permissions \u2014 nothing else is required:<\/p>\n\n<ul>\n<li><code>asset.read<\/code> \u2014 list asset metadata and run library searches (browse, search by query, search by person).<\/li>\n<li><code>asset.view<\/code> \u2014 stream thumbnails and video playback through the proxy.<\/li>\n<li><code>asset.download<\/code> \u2014 fetch full-resolution originals for the proxy and the Copy\/import path.<\/li>\n<li><code>person.read<\/code> \u2014 populate the people filter dropdown and people thumbnails.<\/li>\n<li><code>album.read<\/code> \u2014 list albums in the picker and fetch their assets for the Album Gallery block.<\/li>\n<\/ul>\n\n<p>The same list is shown inline on the Settings page and the per-user profile API key field for easy copy-paste into Immich.<\/p><\/dd>\n<dt id=\"can%20different%20users%20have%20their%20own%20api%20keys%3F\"><h3>Can different users have their own API keys?<\/h3><\/dt>\n<dd><p>Yes. If no site-wide API key is set in <strong>Settings &gt; Immich<\/strong>, each user can add their own key on their <strong>Profile<\/strong> page. The proxy serves media using the key of the user who added the asset.<\/p><\/dd>\n<dt id=\"how%20does%20the%20proxy%20cache%20work%3F\"><h3>How does the proxy cache work?<\/h3><\/dt>\n<dd><p>When a proxied image or video is requested for the first time, the plugin fetches it from Immich and saves a copy in <code>wp-content\/cache\/immich\/<\/code>. All subsequent requests are served from the local cache without contacting your Immich server. To enable automatic cleanup, check <strong>Cache Cleanup<\/strong> in <strong>Settings &gt; Immich<\/strong> and set a lifetime in hours (default 24). When disabled, cached files are kept indefinitely.<\/p><\/dd>\n<dt id=\"does%20the%20lightbox%20work%20automatically%3F\"><h3>Does the lightbox work automatically?<\/h3><\/dt>\n<dd><p>Yes. Posts containing proxied Immich images automatically get a lightbox. Clicking an image opens the full-resolution original in an overlay. Press Escape or click anywhere to close.<\/p><\/dd>\n<dt id=\"how%20do%20i%20embed%20a%20whole%20immich%20album%20in%20a%20post%3F\"><h3>How do I embed a whole Immich album in a post?<\/h3><\/dt>\n<dd><p>Add the \"Immich Album Gallery\" block from the inserter, click \"Pick album\", and choose an album from your Immich server. The gallery renders live and is cached for 5 minutes; you can override per-block options like columns, image size, sort, and lightbox in the block sidebar.<\/p>\n\n<p>For large albums where the global cap (default 100) trims the rendered set, the block has an optional \"Show 'View on Immich' link\" toggle that appends a link to the album in the Immich web UI. Leave it off unless your Immich URL is reachable from your visitors' browsers \u2014 many self-hosted setups put Immich behind a VPN or on a Docker-internal hostname that won't resolve outside the LAN.<\/p><\/dd>\n<dt id=\"i%20use%20nginx%20%E2%80%94%20do%20i%20need%20extra%20server%20config%3F\"><h3>I use Nginx \u2014 do I need extra server config?<\/h3><\/dt>\n<dd><p>Yes. The plugin caches proxied Immich binaries under <code>wp-content\/uploads\/immich-cache\/<\/code>, and the proxy endpoint enforces post-status authorisation on every request. On Apache the plugin drops a deny-all <code>.htaccess<\/code> into that directory automatically so nothing else can serve the cached files. Nginx ignores <code>.htaccess<\/code>, so you need an equivalent rule in your site's server block:<\/p>\n\n<pre><code>location ^~ \/wp-content\/uploads\/immich-cache\/ { deny all; return 404; }\n<\/code><\/pre>\n\n<p>Without that, a visitor who captured a cached asset URL from rendered HTML could fetch the file directly even after the post is unpublished or made private.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>New: <strong>Immich Album Gallery block<\/strong> \u2014 embed a live Immich album as a gallery using the core Gallery markup, with per-block columns, image size, sort order, limit, captions, and lightbox options. Album data is cached for 5 minutes with a manual \"Refresh from Immich\" link for editors.<\/li>\n<li>New: <strong>Local proxy cache<\/strong> \u2014 proxied images and videos are saved to disk on first request and served locally afterwards, with optional automatic cleanup and a configurable lifetime.<\/li>\n<li>New: <strong>Cache Files admin page<\/strong> (Media \u2192 Cache Files) to review and clear cached thumbnails and album lists.<\/li>\n<li>New: <strong>Copy Resolution setting<\/strong> \u2014 choose the resolution used when copying\/importing originals into the media library.<\/li>\n<li>New: <strong>Test Connection button<\/strong> on the Settings page to verify your server URL and API key before saving.<\/li>\n<li>New: Per-tile previews and video badges in the picker, a resizable picker split, and other picker UX refinements.<\/li>\n<li>Improved: Required Immich API key permissions are now documented inline on the Settings and Profile pages.<\/li>\n<li>Improved: Picker type filtering is pushed into the Immich query, and previously-added assets of a mismatched type are shown but disabled.<\/li>\n<li>Security &amp; hardening: private Cache-Control on per-user proxy paths, per-user API key UI gated on the <code>upload_files<\/code> capability, and assorted Plugin Check fixes.<\/li>\n<li>Tested up to WordPress 7.0.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Use photos and videos from your Immich server in WordPress without copying files, or import them into the media library.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/291507","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=291507"}],"author":[{"embeddable":true,"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/donncha"}],"wp:attachment":[{"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=291507"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=291507"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=291507"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=291507"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=291507"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=291507"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}