{"id":4709,"date":"2026-04-12T18:07:25","date_gmt":"2026-04-12T18:07:25","guid":{"rendered":"https:\/\/frontlinenewsng.org\/?p=4709"},"modified":"2026-04-12T18:07:25","modified_gmt":"2026-04-12T18:07:25","slug":"donncha-media-picker-for-immich-self-hosted-photos-in-wordpress","status":"publish","type":"post","link":"https:\/\/frontlinenewsng.org\/?p=4709","title":{"rendered":"Donncha: Media Picker for Immich: Self-Hosted Photos in WordPress"},"content":{"rendered":"<p>I\u2019ve just released Media Picker for Immich on the WordPress.org plugin directory. It connects WordPress to a self-hosted <a href=\"https:\/\/immich.app\/\">Immich<\/a> server so you can browse, search, and insert your photos and videos into posts without copying files around.<\/p>\n<h3 class=\"wp-block-heading\">Immich<\/h3>\n<p>I run Immich at home. It\u2019s where my photos now live. They\u2019re  organised, searchable, with facial recognition and AI search. My WordPress uploads directory is where photos used to go, and the two never talked to each other. This plugin fixes that.<\/p>\n<h3 class=\"wp-block-heading\">How it works<\/h3>\n<p>Point the plugin at your Immich server and give it an API key. You can set a site-wide key or let each user configure their own to connect to their own Immich account.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-opt-id=1382114196  fetchpriority=\"high\" decoding=\"async\" alt=\"Screenshot 1: Settings \u2192 Immich:\nServer address and blank site-wide API key, default cache settings\" class=\"wp-image-89592707 not-transparent\" height=\"478\" src=\"https:\/\/odd.blog\/files\/2026\/04\/immich-settings-page.avif\" width=\"727\" \/><\/figure>\n<\/div>\n<p>If the site-wide key is blank, each user adds their own key on their profile page. All Immich API calls happen server-side.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-opt-id=1683810381  fetchpriority=\"high\" decoding=\"async\" alt=\"Screenshot 2: User Profile page, Immich API Key field showing *******.\" class=\"wp-image-89592708 not-transparent\" height=\"194\" src=\"https:\/\/odd.blog\/files\/2026\/04\/immich-user-profile-settings.avif\" width=\"607\" \/><\/figure>\n<\/div>\n<h3 class=\"wp-block-heading\">Two ways to add media<\/h3>\n<p>Once configured, an Immich tab appears in two places.<\/p>\n<p>The first is the Media Library grid. Switch to the Immich view and you can search, filter by person, and either Use or Copy assets into WordPress.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-opt-id=710901236  data-opt-src=\"https:\/\/odd.blog\/files\/2026\/04\/media-picker2-1.avif\"  decoding=\"async\" alt=\"Screenshot 3: Media \u2192 Library, Immich view.\" class=\"wp-image-89592710 not-transparent\" height=\"717\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" width=\"1385\" \/><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li><strong>Use<\/strong> creates a virtual attachment. Nothing is copied; WordPress proxies the media from Immich on demand and caches it locally on first request. Your uploads directory stays lean.<\/li>\n<li><strong>Copy<\/strong> downloads the original file into wp-content\/uploads\/ as a normal attachment.<\/li>\n<\/ul>\n<p>The same tab shows up in the \u201cSelect or Upload Media\u201d dialog inside the post editor, so you can pull an Immich photo straight into a post without leaving the editor.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-opt-id=82862348  data-opt-src=\"https:\/\/odd.blog\/files\/2026\/04\/media-picker1.avif\"  decoding=\"async\" alt=\"Screenshot 4: Select or Upload Media dialog, Immich tab.\" class=\"wp-image-89592711 not-transparent\" height=\"1115\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" width=\"1369\" \/><\/figure>\n<\/div>\n<h3 class=\"wp-block-heading\">A few details worth mentioning<\/h3>\n<ul class=\"wp-block-list\">\n<li>Videos work too. Proxied videos stream with seek support.<\/li>\n<li>Lightbox. Proxied Immich images in posts open a full-resolution lightbox on click.<\/li>\n<li>Local cache. Proxied media is cached to wp-content\/cache\/immich\/ after the first fetch. Optional cleanup with a configurable lifetime.<\/li>\n<li>Your server stays private. Immich only needs to be reachable from WordPress \u2014 not from the public internet. Visitors never connect to Immich directly.<\/li>\n<li>When images are copied over, virtually or otherwise, you can insert them into a post like any other image, which also includes adding them to galleries in posts.<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\">Get it<\/h3>\n<p>Install it from the <a href=\"https:\/\/wordpress.org\/plugins\/media-picker-for-immich\/\">WordPress plugin directory<\/a> or search for \u201cmedia picker for Immich\u201d in the plugins page in WordPress.<\/p>\n<p>Feedback and bug reports are welcome. Development is done on GitHub <a href=\"https:\/\/github.com\/donnchawp\/media-picker-for-immich\">here<\/a>.<\/p>\n<p>#Immich #WordPress #WordPressplugin<\/p>","protected":false},"excerpt":{"rendered":"<p>I\u2019ve just released Media Picker for Immich on the WordPress.org plugin directory. It connects WordPress to a self-hosted Immich server so you can browse, search, and insert your photos and videos into posts without copying files around. Immich I run Immich at home. It\u2019s where my photos now live. They\u2019re organised, searchable, with facial recognition [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4710,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_post_was_ever_published":false,"_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":""},"categories":[1],"tags":[],"class_list":["post-4709","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-latest-news"],"jetpack_featured_media_url":"https:\/\/mlcqvjhyzqda.i.optimole.com\/cb:bmgV.7d4\/w:auto\/h:auto\/q:mauto\/f:best\/https:\/\/frontlinenewsng.org\/wp-content\/uploads\/2026\/04\/immich-settings-page-e2elFF.avif","jetpack_likes_enabled":true,"jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/frontlinenewsng.org\/index.php?rest_route=\/wp\/v2\/posts\/4709","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/frontlinenewsng.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/frontlinenewsng.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/frontlinenewsng.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/frontlinenewsng.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4709"}],"version-history":[{"count":0,"href":"https:\/\/frontlinenewsng.org\/index.php?rest_route=\/wp\/v2\/posts\/4709\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/frontlinenewsng.org\/index.php?rest_route=\/wp\/v2\/media\/4710"}],"wp:attachment":[{"href":"https:\/\/frontlinenewsng.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4709"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/frontlinenewsng.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4709"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/frontlinenewsng.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4709"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}