{"id":54610,"date":"2013-12-10T13:14:41","date_gmt":"2013-12-10T13:14:41","guid":{"rendered":"https:\/\/wordpress.org\/plugins-wp\/portrait-archiv-shop\/"},"modified":"2026-09-15T07:11:01","modified_gmt":"2026-09-15T07:11:01","slug":"portrait-archiv-shop","status":"publish","type":"plugin","link":"https:\/\/cn.wordpress.org\/plugins\/portrait-archiv-shop\/","author":7754360,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"4.7.0","stable_tag":"4.7.0","tested":"7.1.1","requires":"6.2","requires_php":"8.1","requires_plugins":null,"header_name":"Portrait-Archiv Photostore \u2013 Sell Photos & Client Galleries","header_author":"Thomas Schiffler","header_description":"","assets_banners_color":"8b7e7e","last_updated":"2026-09-15 07:11:01","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/www.portrait-service.com","header_plugin_uri":"http:\/\/wordpress.org\/plugins\/portrait-archiv-shop\/","header_author_uri":"https:\/\/www.portrait-service.com\/","rating":3.7,"author_block_rating":0,"active_installs":10,"downloads":5552,"num_ratings":3,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0":{"tag":"1.0","author":"tschiffler","date":"2013-12-10 13:19:48","revision":818249},"1.0.1":{"tag":"1.0.1","author":"tschiffler","date":"2013-12-11 11:46:01","revision":818827},"1.1":{"tag":"1.1","author":"tschiffler","date":"2013-12-12 11:02:04","revision":819646},"1.1.1":{"tag":"1.1.1","author":"tschiffler","date":"2013-12-12 11:03:35","revision":819648},"1.1.2":{"tag":"1.1.2","author":"tschiffler","date":"2013-12-12 11:05:41","revision":819650},"1.1.3":{"tag":"1.1.3","author":"tschiffler","date":"2013-12-12 11:09:15","revision":819656},"1.1.4":{"tag":"1.1.4","author":"tschiffler","date":"2013-12-12 11:14:58","revision":819672},"1.2":{"tag":"1.2","author":"tschiffler","date":"2013-12-12 11:33:35","revision":819699},"1.3":{"tag":"1.3","author":"tschiffler","date":"2013-12-18 20:30:48","revision":824986},"1.3.1":{"tag":"1.3.1","author":"tschiffler","date":"2013-12-18 20:40:47","revision":825008},"1.3.2":{"tag":"1.3.2","author":"tschiffler","date":"2013-12-18 20:45:10","revision":825012},"1.3.3":{"tag":"1.3.3","author":"tschiffler","date":"2013-12-18 20:51:21","revision":825033},"1.4":{"tag":"1.4","author":"tschiffler","date":"2013-12-23 10:36:50","revision":827375},"1.4.1":{"tag":"1.4.1","author":"tschiffler","date":"2013-12-23 10:46:56","revision":827392},"1.5":{"tag":"1.5","author":"tschiffler","date":"2013-12-27 09:33:15","revision":828954},"1.5.1":{"tag":"1.5.1","author":"tschiffler","date":"2013-12-27 09:41:50","revision":828972},"1.5.2":{"tag":"1.5.2","author":"tschiffler","date":"2014-02-04 05:13:02","revision":851014},"1.5.3":{"tag":"1.5.3","author":"tschiffler","date":"2014-02-04 05:18:36","revision":851030},"1.6":{"tag":"1.6","author":"tschiffler","date":"2014-03-10 16:20:04","revision":872861},"1.6.1":{"tag":"1.6.1","author":"tschiffler","date":"2014-03-10 16:27:21","revision":872878},"1.6.2":{"tag":"1.6.2","author":"tschiffler","date":"2014-04-16 16:08:27","revision":894388},"1.6.3":{"tag":"1.6.3","author":"tschiffler","date":"2014-05-08 14:59:13","revision":910552},"1.6.4":{"tag":"1.6.4","author":"tschiffler","date":"2014-06-01 16:12:41","revision":924733},"1.7":{"tag":"1.7","author":"tschiffler","date":"2014-12-15 08:14:58","revision":1044763},"2.0":{"tag":"2.0","author":"tschiffler","date":"2015-10-29 19:21:34","revision":1275732},"2.1":{"tag":"2.1","author":"tschiffler","date":"2015-10-29 19:29:38","revision":1275753},"2.1.1":{"tag":"2.1.1","author":"tschiffler","date":"2015-11-03 06:16:58","revision":1278325},"2.1.2":{"tag":"2.1.2","author":"tschiffler","date":"2015-11-03 06:24:54","revision":1278345},"2.1.3":{"tag":"2.1.3","author":"tschiffler","date":"2015-11-05 17:03:16","revision":1280520},"2.2":{"tag":"2.2","author":"tschiffler","date":"2016-03-24 06:02:52","revision":1377609},"2.2.1":{"tag":"2.2.1","author":"tschiffler","date":"2016-03-29 15:27:26","revision":1381149},"2.2.2":{"tag":"2.2.2","author":"tschiffler","date":"2016-03-29 17:37:09","revision":1381266},"2.2.3":{"tag":"2.2.3","author":"tschiffler","date":"2016-03-30 04:27:15","revision":1381656},"2.2.4":{"tag":"2.2.4","author":"tschiffler","date":"2016-03-30 04:47:12","revision":1381677},"2.2.5":{"tag":"2.2.5","author":"tschiffler","date":"2016-03-30 19:31:41","revision":1382224},"2.3":{"tag":"2.3","author":"tschiffler","date":"2017-02-25 10:19:39","revision":1603403},"3.0":{"tag":"3.0","author":"tschiffler","date":"2017-11-22 18:03:36","revision":1773379},"3.1":{"tag":"3.1","author":"tschiffler","date":"2019-01-04 12:05:22","revision":2006264},"3.2":{"tag":"3.2","author":"tschiffler","date":"2019-09-15 13:45:05","revision":2156763},"3.3":{"tag":"3.3","author":"tschiffler","date":"2019-09-16 09:17:44","revision":2157144},"3.4":{"tag":"3.4","author":"tschiffler","date":"2019-09-22 09:39:25","revision":2160897},"3.5":{"tag":"3.5","author":"tschiffler","date":"2019-09-23 13:21:35","revision":2161446},"3.6":{"tag":"3.6","author":"tschiffler","date":"2019-09-23 13:23:26","revision":2161450},"3.7":{"tag":"3.7","author":"tschiffler","date":"2019-11-26 19:10:50","revision":2201555},"4.0":{"tag":"4.0","author":"tschiffler","date":"2026-08-24 11:27:46","revision":3663275},"4.1.0":{"tag":"4.1.0","author":"tschiffler","date":"2026-08-25 06:25:59","revision":3664701},"4.2.0":{"tag":"4.2.0","author":"tschiffler","date":"2026-08-27 10:13:18","revision":3668566},"4.3.0":{"tag":"4.3.0","author":"tschiffler","date":"2026-08-28 09:22:33","revision":3670076},"4.3.1":{"tag":"4.3.1","author":"tschiffler","date":"2026-09-01 12:33:13","revision":3676089},"4.3.2":{"tag":"4.3.2","author":"tschiffler","date":"2026-09-07 06:42:44","revision":3684296},"4.3.3":{"tag":"4.3.3","author":"tschiffler","date":"2026-09-07 07:25:44","revision":3684359},"4.4.0":{"tag":"4.4.0","author":"tschiffler","date":"2026-09-07 12:00:59","revision":3684809},"4.5.0":{"tag":"4.5.0","author":"tschiffler","date":"2026-09-08 12:55:38","revision":3686642},"4.6.0":{"tag":"4.6.0","author":"tschiffler","date":"2026-09-10 16:57:13","revision":3690233},"4.7.0":{"tag":"4.7.0","author":"tschiffler","date":"2026-09-15 07:11:01","revision":3696355}},"upgrade_notice":{"4.0":"<p>Major rebuild: sell your photos from a modern WordPress cockpit. Requires WordPress 6.2+ and PHP 8.1+.<\/p>"},"ratings":{"1":1,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3684809,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3684809,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3663275,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3663275,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3696355,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/\",\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"features\":{\"networking\":true},\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"portrait-archiv-shop\"},\"options\":{\"activate\":true}},{\"step\":\"installTheme\",\"themeData\":{\"resource\":\"wordpress.org\\\/themes\",\"slug\":\"twentytwentyfive\"},\"options\":{\"activate\":false}},{\"step\":\"setSiteLanguage\",\"language\":\"de_DE_formal\"},{\"step\":\"mkdir\",\"path\":\"\\\/wordpress\\\/wp-content\\\/themes\\\/pawps-demo\"},{\"step\":\"writeFile\",\"path\":\"\\\/wordpress\\\/wp-content\\\/themes\\\/pawps-demo\\\/style.css\",\"data\":\"\\\/*\\nTheme Name: Portrait-Archiv Demo\\nTheme URI: https:\\\/\\\/portrait-archiv.com\\\/\\nDescription: Minimales Child-Theme fuer die WordPress-Playground-Demo. Setzt vor allem die Layout-Breite, damit die Galerie-Ausgabe Platz hat.\\nAuthor: Portrait-Service\\nTemplate: twentytwentyfive\\nVersion: 1.0.0\\nLicense: GPLv2 or later\\nText Domain: pawps-demo\\n*\\\/\\n\\n\\\/* Die Galerie-Ausgabe bringt ihre eigene CSS mit (assets\\\/css\\\/pawps-shop.css);\\n   hier steht bewusst nur, was das Theme beisteuern muss. *\\\/\\n\\n.wp-block-pawps-public-list,\\n.wp-block-pawps-gallery {\\n\\tmargin-top: 2.5rem;\\n\\tmargin-bottom: 2.5rem;\\n}\\n\\n\\\/* Kopfbereich straffen.\\n\\n   Die Live-Vorschau laeuft in einem kleinen Rahmen, und Twenty Twenty-Five\\n   setzt zwischen Kopfzeile und Inhalt ZWEIMAL bis zu 70px Luft: einmal als\\n   Abstand vor <main>, einmal als Innenabstand der Gruppe darin. Gemessen:\\n   die erste Galerie begann erst bei 486 von 720 Pixeln Hoehe - zwei Drittel\\n   der sichtbaren Flaeche waren verbraucht, bevor vom Modul etwas zu sehen war.\\n\\n   Beide Werte stehen als INLINE-Stil im Seitentemplate des Eltern-Themes\\n   (`style=\\\"margin-top:var(--wp--preset--spacing--60)\\\"`). Dagegen kommt eine\\n   normale Regel nicht an, deshalb hier `!important`. Die Alternative - das\\n   Abstands-Preset --wp--preset--spacing--60 kleiner setzen - wurde verworfen:\\n   daran haengen auch die Abstaende INNERHALB der Seite, die sollen bleiben. *\\\/\\n.wp-site-blocks > main {\\n\\tmargin-top: 1.5rem !important;\\n}\\n\\n.wp-site-blocks > main > .wp-block-group {\\n\\tpadding-top: 0 !important;\\n}\\n\\n\\\/* Die Kopfzeile selbst etwas flacher: 20px Innenabstand um eine 30px hohe\\n   Zeile sind fuer einen kleinen Rahmen zu grosszuegig. Auch dieser Wert steht\\n   inline im Template (spacing--30), daher wieder `!important`. *\\\/\\nheader.wp-block-template-part .wp-block-group.is-content-justification-space-between {\\n\\tpadding-top: 0.7rem !important;\\n\\tpadding-bottom: 0.7rem !important;\\n}\\n\\n\\\/* Seitentitel optisch ausblenden.\\n\\n   In der Vorschau ist er doppelt gemoppelt: das Menue zeigt bereits, auf\\n   welcher Seite man ist, und die Galerie bringt ihre eigene Ueberschrift mit\\n   (\\\"Hochzeit Demogalerie\\\"). Der Titel kostet damit nur Hoehe.\\n\\n   Bewusst NICHT `display: none`: die Seite behielte sonst keine Ueberschrift\\n   im Dokument. So bleibt die H1 fuer Screenreader und die Gliederung erhalten\\n   und belegt nur keinen Platz mehr. *\\\/\\n.wp-site-blocks > main .wp-block-post-title {\\n\\tposition: absolute;\\n\\twidth: 1px;\\n\\theight: 1px;\\n\\tmargin: -1px;\\n\\tpadding: 0;\\n\\toverflow: hidden;\\n\\tclip-path: inset( 50% );\\n\\twhite-space: nowrap;\\n\\tborder: 0;\\n}\\n\"},{\"step\":\"writeFile\",\"path\":\"\\\/wordpress\\\/wp-content\\\/themes\\\/pawps-demo\\\/theme.json\",\"data\":\"{\\n\\t\\\"$schema\\\": \\\"https:\\\/\\\/schemas.wp.org\\\/trunk\\\/theme.json\\\",\\n\\t\\\"version\\\": 3,\\n\\t\\\"settings\\\": {\\n\\t\\t\\\"appearanceTools\\\": true,\\n\\t\\t\\\"layout\\\": {\\n\\t\\t\\t\\\"contentSize\\\": \\\"1200px\\\",\\n\\t\\t\\t\\\"wideSize\\\": \\\"1400px\\\"\\n\\t\\t},\\n\\t\\t\\\"color\\\": {\\n\\t\\t\\t\\\"palette\\\": [\\n\\t\\t\\t\\t{ \\\"slug\\\": \\\"base\\\", \\\"color\\\": \\\"#fbfaf8\\\", \\\"name\\\": \\\"Base\\\" },\\n\\t\\t\\t\\t{ \\\"slug\\\": \\\"contrast\\\", \\\"color\\\": \\\"#1f1d1a\\\", \\\"name\\\": \\\"Contrast\\\" },\\n\\t\\t\\t\\t{ \\\"slug\\\": \\\"accent\\\", \\\"color\\\": \\\"#8a6a4b\\\", \\\"name\\\": \\\"Accent\\\" },\\n\\t\\t\\t\\t{ \\\"slug\\\": \\\"muted\\\", \\\"color\\\": \\\"#6f6a63\\\", \\\"name\\\": \\\"Muted\\\" }\\n\\t\\t\\t]\\n\\t\\t},\\n\\t\\t\\\"typography\\\": {\\n\\t\\t\\t\\\"fluid\\\": true\\n\\t\\t}\\n\\t},\\n\\t\\\"styles\\\": {\\n\\t\\t\\\"color\\\": {\\n\\t\\t\\t\\\"background\\\": \\\"var(--wp--preset--color--base)\\\",\\n\\t\\t\\t\\\"text\\\": \\\"var(--wp--preset--color--contrast)\\\"\\n\\t\\t},\\n\\t\\t\\\"elements\\\": {\\n\\t\\t\\t\\\"button\\\": {\\n\\t\\t\\t\\t\\\"color\\\": {\\n\\t\\t\\t\\t\\t\\\"background\\\": \\\"var(--wp--preset--color--accent)\\\",\\n\\t\\t\\t\\t\\t\\\"text\\\": \\\"var(--wp--preset--color--base)\\\"\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"},{\"step\":\"writeFile\",\"path\":\"\\\/wordpress\\\/wp-content\\\/themes\\\/pawps-demo\\\/functions.php\",\"data\":\"<?php\\n\\\/**\\n * Bindet das Stylesheet dieses Child-Themes ein.\\n *\\n * Block-Themes laden die `style.css` eines Child-Themes NICHT von selbst -\\n * anders als klassische Themes, bei denen das Eltern-Theme sie ueblicherweise\\n * mit einreiht. Ohne diese Datei bleiben also alle Regeln in `style.css`\\n * wirkungslos; in dieser Demo war das bis 4.4.0 unbemerkt der Fall.\\n *\\n * @package Portrait_Archiv_Shop_Demo\\n *\\\/\\n\\ndefined( 'ABSPATH' ) || exit;\\n\\nadd_action(\\n\\t'wp_enqueue_scripts',\\n\\tstatic function () {\\n\\t\\twp_enqueue_style(\\n\\t\\t\\t'pawps-demo',\\n\\t\\t\\tget_stylesheet_uri(),\\n\\t\\t\\tarray(),\\n\\t\\t\\t(string) wp_get_theme()->get( 'Version' )\\n\\t\\t);\\n\\t}\\n);\\n\"},{\"step\":\"activateTheme\",\"themeFolderName\":\"pawps-demo\"},{\"step\":\"defineWpConfigConsts\",\"consts\":{\"PAWPS_DEMO_USERID\":\"7934\",\"PAWPS_DEMO_HASH\":\"SUAAX18fffHVYA8\",\"PAWPS_DEMO_HASH_REMOTE\":\"UMKNV18fffLROSU\",\"PAWPS_DEMO_GALERIE_CODE\":\"7934-13847-2146\",\"PAWPS_DEMO_GALERIE_HOCHZEIT\":\"7934-13926-405\",\"PAWPS_DEMO_GALERIE_KINDERGARTEN\":\"7934-13925-634\",\"PAWPS_DEMO_QR_CODES\":\"HDXRMK:7,IIZKIT:8,FXJSSX:8,BVVPZF:11,JNPMLP:10\",\"PAWPS_DEMO_LINK_KINDERGARTEN\":\"https:\\\/\\\/www.portrait-service.com\\\/kindergartenfotografie\\\/\",\"PAWPS_DEMO_LINK_BILDSORTIERUNG\":\"https:\\\/\\\/www.portrait-service.com\\\/loesungen\\\/automatische-bildsortierung\\\/\",\"PAWPS_DEMO_SITENAME\":\"Fotostudio Berger\",\"PAWPS_DEMO_TAGLINE\":\"Portraits, Familien und Hochzeiten\"}},{\"step\":\"writeFile\",\"path\":\"\\\/wordpress\\\/wp-content\\\/mu-plugins\\\/pawps-demo.php\",\"data\":\"<?php\\n\\\/**\\n * Plugin Name: Portrait-Archiv Photostore - Demo-Einrichtung\\n * Description: Nur fuer die WordPress.org-Live-Preview. Verbindet die Instanz mit dem Demo-Zugang und blendet aus, was in einer Demo nicht sinnvoll ist.\\n * Version: 2.0.0\\n *\\n * WICHTIG: Diese Datei wird NICHT ausgeliefert. Sie liegt ausserhalb von\\n * plugin\\\/ und wird vom Blueprint als mu-plugin in die Playground-Instanz\\n * geschrieben (siehe bin\\\/build-blueprint.php, docs\\\/playground-demo.md).\\n *\\n * Die Demo laeuft gegen das ECHTE Portrait-Archiv-Backend mit einem echten\\n * Zugang. Der ist dort als Demo-Zugang markiert und serverseitig auf Lesen\\n * plus Warenkorb beschraenkt; Bestellungen werden nicht angenommen. Die\\n * Beschraenkung haengt also nicht an dieser Datei - sie sorgt nur dafuer, dass\\n * der Besucher nicht in Sackgassen laeuft.\\n *\\n * @package Portrait_Archiv_Shop_Demo\\n *\\\/\\n\\ndefined( 'ABSPATH' ) || exit;\\n\\n\\\/**\\n * Richtet die Demo-Instanz ein.\\n *\\\/\\nfinal class Pawps_Demo_Setup {\\n\\n\\t\\\/** Option, die den einmaligen Seed markiert. *\\\/\\n\\tconst OPTION_SEEDED = 'pawps_demo_seeded';\\n\\n\\t\\\/**\\n\\t * Haengt alle Hooks ein.\\n\\t *\\n\\t * @return void\\n\\t *\\\/\\n\\tpublic static function boot() {\\n\\t\\tadd_action( 'init', array( __CLASS__, 'seed' ), 20 );\\n\\t\\tadd_action( 'admin_menu', array( __CLASS__, 'hide_admin_pages' ), 999 );\\n\\t\\tadd_filter( 'rest_pre_dispatch', array( __CLASS__, 'block_rest_routes' ), 10, 3 );\\n\\t\\tadd_action( 'admin_notices', array( __CLASS__, 'admin_notice' ) );\\n\\t}\\n\\n\\t\\\/**\\n\\t * Verbindet die Instanz mit dem Demo-Zugang und legt die Seiten an.\\n\\t *\\n\\t * @return void\\n\\t *\\\/\\n\\tpublic static function seed() {\\n\\t\\tif ( get_option( self::OPTION_SEEDED ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t\\\/\\\/ Zugangsdaten des Demo-Zugangs. Sie stehen oeffentlich in dieser\\n\\t\\t\\\/\\\/ Datei - das ist Absicht und nur deshalb vertretbar, weil der Zugang\\n\\t\\t\\\/\\\/ im Backend als Demo-Zugang markiert ist: er darf ausschliesslich\\n\\t\\t\\\/\\\/ lesen und den Warenkorb fuellen, Bestellungen werden nicht\\n\\t\\t\\\/\\\/ angenommen, und am Backend anmelden kann er sich nicht.\\n\\t\\tupdate_option( 'PAWPS_USERID', PAWPS_DEMO_USERID );\\n\\t\\tupdate_option( 'PAWPS_HASH', PAWPS_DEMO_HASH );\\n\\t\\tupdate_option( 'PAWPS_HASH_REMOTE', PAWPS_DEMO_HASH_REMOTE );\\n\\t\\tupdate_option( 'PAWPS_CONNECTED_SINCE', gmdate( 'Y-m-d' ) );\\n\\n\\t\\t\\\/\\\/ Galerieliste sofort holen. Ohne das steht die Startseite beim ersten\\n\\t\\t\\\/\\\/ Aufruf leer da (\\\"No public galleries are available at the moment\\\"):\\n\\t\\t\\\/\\\/ die oeffentliche Liste liest aus der lokalen Cache-Tabelle, und die\\n\\t\\t\\\/\\\/ fuellt sonst erst der Cron - im Playground also womoeglich nie.\\n\\t\\t\\\/\\\/ Muss VOR seed_pages() laufen, damit die Sichtbarkeit unten greift.\\n\\t\\tif ( function_exists( 'pawps_refreshShootings' ) ) {\\n\\t\\t\\tpawps_refreshShootings();\\n\\t\\t}\\n\\n\\t\\tself::qr_galerie_aus_der_liste_nehmen();\\n\\t\\tself::seed_pages();\\n\\n\\t\\tupdate_option( self::OPTION_SEEDED, 1, false );\\n\\t}\\n\\n\\t\\\/**\\n\\t * Nimmt die QR-Veranstaltung aus der oeffentlichen Galerie-Liste.\\n\\t *\\n\\t * Sie hat ihre eigene Seite mit Erklaerung; in der Liste hat sie nichts zu\\n\\t * suchen (das Plugin verbietet das fuer QR-Veranstaltungen auch im\\n\\t * Admin - Kinderschutz). Status 5 = \\\"nur mit Galeriecode\\\"; direkt\\n\\t * eingebettet bleibt die Galerie trotzdem sichtbar, weil der Shortcode\\n\\t * die Statuspruefung uebersteuert.\\n\\t *\\n\\t * @return void\\n\\t *\\\/\\n\\tprivate static function qr_galerie_aus_der_liste_nehmen() {\\n\\t\\tglobal $wpdb;\\n\\n\\t\\tif ( ! defined( 'PAWPS_TABLENAME_CONFIG' ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t\\\/\\\/ phpcs:ignore WordPress.DB.DirectDatabaseQuery -- Cache-Tabelle des Plugins, nur in der Demo-Instanz.\\n\\t\\t$wpdb->update(\\n\\t\\t\\tPAWPS_TABLENAME_CONFIG,\\n\\t\\t\\tarray( 'state' => 5 ),\\n\\t\\t\\tarray( 'shootingcode' => PAWPS_DEMO_GALERIE_KINDERGARTEN )\\n\\t\\t);\\n\\t}\\n\\n\\t\\\/**\\n\\t * Zerlegt PAWPS_DEMO_QR_CODES (\\\"CODE:anzahl,CODE:anzahl\\\") in eine Liste.\\n\\t *\\n\\t * @return array<int,array{code:string,bilder:int}>\\n\\t *\\\/\\n\\tprivate static function qr_codes() {\\n\\t\\t$liste = array();\\n\\t\\tforeach ( explode( ',', (string) PAWPS_DEMO_QR_CODES ) as $eintrag ) {\\n\\t\\t\\t$teile = explode( ':', trim( $eintrag ) );\\n\\t\\t\\tif ( '' === $teile[0] ) {\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\t\\t\\t$liste[] = array(\\n\\t\\t\\t\\t'code'   => $teile[0],\\n\\t\\t\\t\\t'bilder' => isset( $teile[1] ) ? (int) $teile[1] : 0,\\n\\t\\t\\t);\\n\\t\\t}\\n\\n\\t\\treturn $liste;\\n\\t}\\n\\n\\t\\\/**\\n\\t * Legt die Demo-Seiten an und macht die Galerieliste zur Startseite.\\n\\t *\\n\\t * @return void\\n\\t *\\\/\\n\\tprivate static function seed_pages() {\\n\\t\\tself::standardinhalte_entfernen();\\n\\n\\t\\t$galerien = self::seite(\\n\\t\\t\\t'Galerien',\\n\\t\\t\\t'galerien',\\n\\t\\t\\t0,\\n\\t\\t\\t\\\"<!-- wp:paragraph -->\\\\n<p>Das Modul kann eine <strong>Liste Ihrer \\u00f6ffentlichen Galerien<\\\/strong> \\\"\\n\\t\\t\\t\\t. \\\"anzeigen: Galerien, die ohne Kennwort f\\u00fcr jeden sichtbar sind. Diese Seite ist die Demo dazu. \\\"\\n\\t\\t\\t\\t. \\\"Welche Galerie \\u00f6ffentlich erscheint, entscheiden Sie im Modul pro Galerie.<\\\/p>\\\\n\\\"\\n\\t\\t\\t\\t. \\\"<!-- \\\/wp:paragraph -->\\\\n\\\"\\n\\t\\t\\t\\t. \\\"<!-- wp:paragraph -->\\\\n<p>Die Galerien kommen aus einem echten Portrait-Archiv-Konto. \\\"\\n\\t\\t\\t\\t. \\\"W\\u00e4hlen Sie eine aus, sehen Sie sich die Fotos an und stellen Sie eine Bestellung zusammen \\u2013 \\\"\\n\\t\\t\\t\\t. \\\"der komplette Kundenablauf funktioniert hier. In dieser Demo wird dabei nichts \\\"\\n\\t\\t\\t\\t. \\\"wirklich bestellt.<\\\/p>\\\\n\\\"\\n\\t\\t\\t\\t. \\\"<!-- \\\/wp:paragraph -->\\\\n\\\"\\n\\t\\t\\t\\t. '<!-- wp:pawps\\\/public-list {\\\"align\\\":\\\"wide\\\"} \\\/-->'\\n\\t\\t);\\n\\n\\t\\tself::seite(\\n\\t\\t\\t'Hochzeit',\\n\\t\\t\\t'hochzeit',\\n\\t\\t\\t1,\\n\\t\\t\\t\\\"<!-- wp:paragraph -->\\\\n<p>Eine echte Hochzeitsgalerie, direkt in diese Seite eingebettet \\u2013 so sieht \\\"\\n\\t\\t\\t\\t. \\\"sie Ihr Kunde. Foto \\u00f6ffnen, Format w\\u00e4hlen, in den Warenkorb legen; auch die Kasse funktioniert. \\\"\\n\\t\\t\\t\\t. \\\"In dieser Demo wird dabei nichts wirklich bestellt.<\\\/p>\\\\n<!-- \\\/wp:paragraph -->\\\\n\\\"\\n\\t\\t\\t\\t. '<!-- wp:pawps\\\/gallery {\\\"galleryCode\\\":\\\"' . PAWPS_DEMO_GALERIE_HOCHZEIT . '\\\",\\\"align\\\":\\\"wide\\\"} \\\/-->'\\n\\t\\t);\\n\\n\\t\\tself::seite( 'Kindergarten', 'kindergarten', 2, self::kindergarten_inhalt() );\\n\\n\\t\\tself::seite(\\n\\t\\t\\t'Galeriecode eingeben',\\n\\t\\t\\t'galeriecode',\\n\\t\\t\\t3,\\n\\t\\t\\t\\\"<!-- wp:paragraph -->\\\\n<p>G\\u00e4ste mit einem Galeriecode \\u00f6ffnen ihre Galerie hier. \\\"\\n\\t\\t\\t\\t. 'Probieren Sie es mit <code>' . PAWPS_DEMO_GALERIE_CODE . \\\"<\\\/code>.<\\\/p>\\\\n<!-- \\\/wp:paragraph -->\\\\n\\\"\\n\\t\\t\\t\\t. '<!-- wp:pawps\\\/gallery-code \\\/-->'\\n\\t\\t);\\n\\n\\t\\t\\\/\\\/ Eigene Warenkorb-Seite: dadurch fuehren alle Warenkorb-Links hierher,\\n\\t\\t\\\/\\\/ statt den Warenkorb auf der Galerie-Seite einzublenden.\\n\\t\\tself::seite(\\n\\t\\t\\t'Warenkorb',\\n\\t\\t\\t'warenkorb',\\n\\t\\t\\t4,\\n\\t\\t\\t\\\"<!-- wp:paragraph -->\\\\n<p>Der Warenkorb hat eine eigene Seite \\u2013 deshalb steht er \\\"\\n\\t\\t\\t\\t. \\\"hier im Men\\u00fc und beh\\u00e4lt eine eigene Adresse. Legen Sie in einer Galerie ein \\\"\\n\\t\\t\\t\\t. \\\"Foto in den Warenkorb, erscheint es hier. Bestellen k\\u00f6nnen Sie in dieser \\\"\\n\\t\\t\\t\\t. \\\"Demo nicht.<\\\/p>\\\\n<!-- \\\/wp:paragraph -->\\\\n\\\"\\n\\t\\t\\t\\t. '<!-- wp:pawps\\\/cart {\\\"align\\\":\\\"wide\\\"} \\\/-->'\\n\\t\\t);\\n\\n\\t\\tif ( $galerien ) {\\n\\t\\t\\tupdate_option( 'show_on_front', 'page' );\\n\\t\\t\\tupdate_option( 'page_on_front', $galerien );\\n\\t\\t}\\n\\n\\t\\tupdate_option( 'blogname', PAWPS_DEMO_SITENAME );\\n\\t\\tupdate_option( 'blogdescription', PAWPS_DEMO_TAGLINE );\\n\\t}\\n\\n\\t\\\/**\\n\\t * Entfernt die Standardinhalte der WordPress-Installation.\\n\\t *\\n\\t * \\\"Sample Page\\\" steht sonst im Menue neben den Demo-Seiten und fuehrt ins\\n\\t * Nichts; \\\"Hello world!\\\" ist der Beispielbeitrag. Beides hat in einer\\n\\t * Produktvorschau nichts zu suchen.\\n\\t *\\n\\t * @return void\\n\\t *\\\/\\n\\tprivate static function standardinhalte_entfernen() {\\n\\t\\tforeach ( array( 'sample-page', 'hello-world' ) as $slug ) {\\n\\t\\t\\t$beitrag = get_page_by_path( $slug, OBJECT, array( 'page', 'post' ) );\\n\\t\\t\\tif ( $beitrag ) {\\n\\t\\t\\t\\twp_delete_post( $beitrag->ID, true );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t\\\/**\\n\\t * Inhalt der Kindergarten-Seite: Erklaerung, QR-Codes, dann die Galerie.\\n\\t *\\n\\t * @return string\\n\\t *\\\/\\n\\tprivate static function kindergarten_inhalt() {\\n\\t\\t$punkte = '';\\n\\t\\tforeach ( self::qr_codes() as $eintrag ) {\\n\\t\\t\\t$punkte .= sprintf(\\n\\t\\t\\t\\t\\\"<!-- wp:list-item -->\\\\n<li><code>%s<\\\/code> \\u2013 %d Bilder dieses Kindes<\\\/li>\\\\n<!-- \\\/wp:list-item -->\\\\n\\\",\\n\\t\\t\\t\\t$eintrag['code'],\\n\\t\\t\\t\\t$eintrag['bilder']\\n\\t\\t\\t);\\n\\t\\t}\\n\\n\\t\\treturn \\\"<!-- wp:paragraph -->\\\\n<p><strong>Demo-Kindergarten.<\\\/strong> Jedes Kind bekommt eine Karte mit \\\"\\n\\t\\t\\t. \\\"eigenem QR-Code. Der Code schaltet ausschlie\\u00dflich die Bilder dieses Kindes frei \\u2013 Eltern sehen die \\\"\\n\\t\\t\\t. \\\"Fotos anderer Kinder nie. Nur die Gruppenbilder sind f\\u00fcr alle offen.<\\\/p>\\\\n<!-- \\\/wp:paragraph -->\\\\n\\\"\\n\\t\\t\\t\\\/\\\/ Die beiden Kernaussagen sind direkt im Satz verlinkt, statt am Ende\\n\\t\\t\\t\\\/\\\/ als \\\"Mehr dazu\\\"-Nachtrag zu stehen: dort liest sie kaum jemand.\\n\\t\\t\\t. \\\"<!-- wp:paragraph -->\\\\n<p>Damit ist die \\\"\\n\\t\\t\\t. '<a href=\\\"' . esc_url( PAWPS_DEMO_LINK_BILDSORTIERUNG ) . '\\\">Bildsortierung DSGVO-konform gel\\u00f6st<\\\/a>'\\n\\t\\t\\t. \\\": Sie ver\\u00f6ffentlichen eine einzige Galerie, die Trennung der Kinder \\u00fcbernimmt der QR-Code. \\\"\\n\\t\\t\\t. \\\"Genau das macht \\\"\\n\\t\\t\\t. '<a href=\\\"' . esc_url( PAWPS_DEMO_LINK_KINDERGARTEN ) . '\\\">Kindergarten- und Schulfotografie<\\\/a>'\\n\\t\\t\\t. \\\" ohne Zettelwirtschaft und ohne Einzelgalerien m\\u00f6glich.<\\\/p>\\\\n<!-- \\\/wp:paragraph -->\\\\n\\\"\\n\\t\\t\\t. \\\"<!-- wp:paragraph -->\\\\n<p>Normalerweise steht der Code auf der Karte. F\\u00fcr diese Demo geben Sie \\\"\\n\\t\\t\\t. \\\"einen dieser Codes unten in der Galerie ein:<\\\/p>\\\\n<!-- \\\/wp:paragraph -->\\\\n\\\"\\n\\t\\t\\t. \\\"<!-- wp:list -->\\\\n<ul class=\\\\\\\"wp-block-list\\\\\\\">\\\\n\\\" . $punkte . \\\"<\\\/ul>\\\\n<!-- \\\/wp:list -->\\\\n\\\"\\n\\t\\t\\t. \\\"<!-- wp:paragraph -->\\\\n<p>Ein anderer Code zeigt ein anderes Kind \\u2013 und sonst nichts.<\\\/p>\\\\n\\\"\\n\\t\\t\\t. \\\"<!-- \\\/wp:paragraph -->\\\\n\\\"\\n\\t\\t\\t. \\\"<!-- wp:paragraph -->\\\\n<p><em>Zum Aufbau dieser Seite:<\\\/em> Die Galerie ist hier fest \\\"\\n\\t\\t\\t. \\\"eingebunden. Genauso gut erreichen Ihre Kunden sie \\u00fcber die Seite \\\"\\n\\t\\t\\t. \\\"\\u00bbGaleriecode eingeben\\u00ab \\u2013 in der \\u00f6ffentlichen Galerie-Liste muss sie daf\\u00fcr nicht \\\"\\n\\t\\t\\t. \\\"auftauchen, und in dieser Demo tut sie es bewusst nicht.<\\\/p>\\\\n<!-- \\\/wp:paragraph -->\\\\n\\\"\\n\\t\\t\\t. '<!-- wp:pawps\\\/gallery {\\\"galleryCode\\\":\\\"' . PAWPS_DEMO_GALERIE_KINDERGARTEN . '\\\",\\\"align\\\":\\\"wide\\\"} \\\/-->';\\n\\t}\\n\\n\\t\\\/**\\n\\t * Legt eine Seite an und liefert ihre ID (0 bei Fehler).\\n\\t *\\n\\t * @param string $titel    Seitentitel.\\n\\t * @param string $slug     Slug.\\n\\t * @param int    $position Menue-Reihenfolge.\\n\\t * @param string $inhalt   Block-Markup.\\n\\t * @return int\\n\\t *\\\/\\n\\tprivate static function seite( $titel, $slug, $position, $inhalt ) {\\n\\t\\t$id = wp_insert_post(\\n\\t\\t\\tarray(\\n\\t\\t\\t\\t'post_title'   => $titel,\\n\\t\\t\\t\\t'post_name'    => $slug,\\n\\t\\t\\t\\t'post_status'  => 'publish',\\n\\t\\t\\t\\t'post_type'    => 'page',\\n\\t\\t\\t\\t'menu_order'   => $position,\\n\\t\\t\\t\\t'post_content' => $inhalt,\\n\\t\\t\\t)\\n\\t\\t);\\n\\n\\t\\treturn ( $id && ! is_wp_error( $id ) ) ? (int) $id : 0;\\n\\t}\\n\\n\\t\\\/**\\n\\t * Nimmt die Seiten aus dem Menue, die in der Demo nicht weiterfuehren.\\n\\t *\\n\\t * Das Backend wuerde diese Aufrufe ohnehin ablehnen - hier geht es nur\\n\\t * darum, dass der Besucher gar nicht erst in eine Fehlermeldung laeuft.\\n\\t *\\n\\t * @return void\\n\\t *\\\/\\n\\tpublic static function hide_admin_pages() {\\n\\t\\tremove_submenu_page( 'pawps_admin_menu_mainpage', 'pawps_onboarding' );\\n\\t\\tremove_submenu_page( 'pawps_admin_menu_mainpage', 'pawps_admin_menu_config' );\\n\\t}\\n\\n\\t\\\/**\\n\\t * Blockt den Upload-Token, damit der Upload-Dialog gar nicht erst startet.\\n\\t *\\n\\t * @param mixed           $result  Vorbelegtes Ergebnis.\\n\\t * @param WP_REST_Server  $server  REST-Server.\\n\\t * @param WP_REST_Request $request Request.\\n\\t * @return mixed\\n\\t *\\\/\\n\\tpublic static function block_rest_routes( $result, $server, $request ) {\\n\\t\\tif ( '\\\/pawps\\\/v1\\\/upload-token' === $request->get_route() ) {\\n\\t\\t\\treturn new WP_Error(\\n\\t\\t\\t\\t'pawps_demo_disabled',\\n\\t\\t\\t\\t'In der Demo nicht verf\\u00fcgbar: f\\u00fcr den Bildupload brauchen Sie ein eigenes Portrait-Archiv-Konto.',\\n\\t\\t\\t\\tarray( 'status' => 403 )\\n\\t\\t\\t);\\n\\t\\t}\\n\\n\\t\\treturn $result;\\n\\t}\\n\\n\\t\\\/**\\n\\t * Weist im Backend auf den Demo-Modus hin.\\n\\t *\\n\\t * @return void\\n\\t *\\\/\\n\\tpublic static function admin_notice() {\\n\\t\\techo '<div class=\\\"notice notice-info\\\"><p><strong>Demo.<\\\/strong> '\\n\\t\\t\\t. 'Diese Seite ist mit einem echten Portrait-Archiv-Demo-Konto verbunden. Galerien und Preislisten sind '\\n\\t\\t\\t. 'Live-Daten. Das Konto darf nur lesen: \\u00c4nderungen werden nicht gespeichert, Bestellungen nicht '\\n\\t\\t\\t. 'angenommen, Bilder lassen sich nicht hochladen. Mit einem eigenen Konto funktioniert das alles '\\n\\t\\t\\t. 'normal.<\\\/p><\\\/div>';\\n\\t}\\n}\\n\\n\\\/\\\/ Testbarkeit: die PHPUnit-Tests laden diese Datei, um die Einrichtung zu\\n\\\/\\\/ pruefen, ohne die Hooks global zu registrieren.\\nif ( ! defined( 'PAWPS_DEMO_NO_BOOT' ) ) {\\n\\tPawps_Demo_Setup::boot();\\n}\\n\"},{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"}]}"}},"all_blocks":{"pawps\/public-list":{"name":"pawps\/public-list","title":"Portrait-Archiv: Gallery list"},"pawps\/gallery":{"name":"pawps\/gallery","title":"Portrait-Archiv: Gallery"},"pawps\/password":{"name":"pawps\/password","title":"Portrait-Archiv: Guest password"},"pawps\/gallery-code":{"name":"pawps\/gallery-code","title":"Portrait-Archiv: Gallery code"},"pawps\/cart":{"name":"pawps\/cart","title":"Portrait-Archiv: Cart"}},"tagged_versions":["1.0","1.0.1","1.1","1.1.1","1.1.2","1.1.3","1.1.4","1.2","1.3","1.3.1","1.3.2","1.3.3","1.4","1.4.1","1.5","1.5.1","1.5.2","1.5.3","1.6","1.6.1","1.6.2","1.6.3","1.6.4","1.7","2.0","2.1","2.1.1","2.1.2","2.1.3","2.2","2.2.1","2.2.2","2.2.3","2.2.4","2.2.5","2.3","3.0","3.1","3.2","3.3","3.4","3.5","3.6","3.7","4.0","4.1.0","4.2.0","4.3.0","4.3.1","4.3.2","4.3.3","4.4.0","4.5.0","4.6.0","4.7.0"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3684809,"resolution":"1","location":"assets","locale":"","width":1600,"height":1125},"screenshot-10.jpg":{"filename":"screenshot-10.jpg","revision":3690233,"resolution":"10","location":"assets","locale":"","width":1600,"height":1125},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3684809,"resolution":"2","location":"assets","locale":"","width":1600,"height":1125},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3684809,"resolution":"3","location":"assets","locale":"","width":1600,"height":1125},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3684809,"resolution":"4","location":"assets","locale":"","width":1600,"height":1125},"screenshot-5.jpg":{"filename":"screenshot-5.jpg","revision":3684809,"resolution":"5","location":"assets","locale":"","width":1600,"height":1125},"screenshot-6.jpg":{"filename":"screenshot-6.jpg","revision":3684809,"resolution":"6","location":"assets","locale":"","width":1600,"height":1125},"screenshot-7.jpg":{"filename":"screenshot-7.jpg","revision":3684809,"resolution":"7","location":"assets","locale":"","width":1600,"height":1125},"screenshot-8.jpg":{"filename":"screenshot-8.jpg","revision":3684809,"resolution":"8","location":"assets","locale":"","width":1600,"height":840},"screenshot-9.jpg":{"filename":"screenshot-9.jpg","revision":3686642,"resolution":"9","location":"assets","locale":"","width":1600,"height":1125}},"screenshots":{"1":"Your gallery on your own website \u2014 visitors browse by folder and order right there.","2":"Opening a photo: choose the product (print, canvas, download \u2026), size and quantity.","3":"Added to the cart \u2014 confirmed right at the button, with the cart total and the way there.","4":"The cart on a page of its own: items, quantities and prices at a glance, with shipping and grand total.","5":"Checkout: shipping address and payment method \u2014 prepayment or PayPal, fees included.","6":"Manage all your galleries right inside WordPress, each with its visibility.","7":"Price lists: set your own sale price and instantly see your net profit per product.","8":"Uploading: pick the target folder inside the gallery, and decide whether the photos are finished or still to be edited after they are ordered.","9":"Student ID cards: the customer fills in the details you defined in your card template and sees the finished card while typing.","10":"See how often a gallery was opened: the daily course, the visitors from your own website and those from Portrait-Archiv.com side by side, and the orders of the same day."}},"plugin_section":[],"plugin_tags":[282,649,10355,2248,20660],"plugin_category":[45,50],"plugin_contributors":[277212],"plugin_business_model":[],"class_list":["post-54610","plugin","type-plugin","status-publish","hentry","plugin_tags-ecommerce","plugin_tags-photo-gallery","plugin_tags-photographer","plugin_tags-photography","plugin_tags-sell-photos","plugin_category-ecommerce","plugin_category-media","plugin_contributors-tschiffler","plugin_committers-tschiffler"],"banners":{"banner":"https:\/\/ps.w.org\/portrait-archiv-shop\/assets\/banner-772x250.png?rev=3663275","banner_2x":"https:\/\/ps.w.org\/portrait-archiv-shop\/assets\/banner-1544x500.png?rev=3663275","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/portrait-archiv-shop\/assets\/icon-128x128.png?rev=3684809","icon_2x":"https:\/\/ps.w.org\/portrait-archiv-shop\/assets\/icon-256x256.png?rev=3684809","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/portrait-archiv-shop\/assets\/screenshot-1.jpg?rev=3684809","caption":"Your gallery on your own website \u2014 visitors browse by folder and order right there."},{"src":"https:\/\/ps.w.org\/portrait-archiv-shop\/assets\/screenshot-2.jpg?rev=3684809","caption":"Opening a photo: choose the product (print, canvas, download \u2026), size and quantity."},{"src":"https:\/\/ps.w.org\/portrait-archiv-shop\/assets\/screenshot-3.jpg?rev=3684809","caption":"Added to the cart \u2014 confirmed right at the button, with the cart total and the way there."},{"src":"https:\/\/ps.w.org\/portrait-archiv-shop\/assets\/screenshot-4.jpg?rev=3684809","caption":"The cart on a page of its own: items, quantities and prices at a glance, with shipping and grand total."},{"src":"https:\/\/ps.w.org\/portrait-archiv-shop\/assets\/screenshot-5.jpg?rev=3684809","caption":"Checkout: shipping address and payment method \u2014 prepayment or PayPal, fees included."},{"src":"https:\/\/ps.w.org\/portrait-archiv-shop\/assets\/screenshot-6.jpg?rev=3684809","caption":"Manage all your galleries right inside WordPress, each with its visibility."},{"src":"https:\/\/ps.w.org\/portrait-archiv-shop\/assets\/screenshot-7.jpg?rev=3684809","caption":"Price lists: set your own sale price and instantly see your net profit per product."},{"src":"https:\/\/ps.w.org\/portrait-archiv-shop\/assets\/screenshot-8.jpg?rev=3684809","caption":"Uploading: pick the target folder inside the gallery, and decide whether the photos are finished or still to be edited after they are ordered."},{"src":"https:\/\/ps.w.org\/portrait-archiv-shop\/assets\/screenshot-9.jpg?rev=3686642","caption":"Student ID cards: the customer fills in the details you defined in your card template and sees the finished card while typing."},{"src":"https:\/\/ps.w.org\/portrait-archiv-shop\/assets\/screenshot-10.jpg?rev=3690233","caption":"See how often a gallery was opened: the daily course, the visitors from your own website and those from Portrait-Archiv.com side by side, and the orders of the same day."}],"raw_content":"<!--section=description-->\n<p><strong>Sell your photos from WordPress \u2014 without running an online shop.<\/strong> Publish your galleries, and Portrait-Service takes care of everything else: secure payment, professional production and direct shipping to your customer. Every month you receive your commission \u2014 with a detailed statement. No shop setup, no logistics, no accounting on your side.<\/p>\n\n<p>Running a real online shop is a huge effort for a photographer: payment providers, invoicing, VAT, print production, packaging, shipping, returns. <strong>This plugin (and the Portrait-Archiv.com service behind it) takes all of that off your plate<\/strong> \u2014 so selling your photos becomes realistic even for a small studio or a hobby photographer, without complexity.<\/p>\n\n<p><strong>What makes it different<\/strong><\/p>\n\n<ul>\n<li><strong>Built for school &amp; kindergarten photography (QR codes).<\/strong> Shoot whole classes with per-child QR codes: on upload every child\u2019s photos are sorted into their own protected folder. Parents enter the personal code from their child\u2019s card and see <strong>only their own child plus the group photos<\/strong> \u2014 never another family\u2019s children. Enforced on the server for real privacy (GDPR), with a 7-day, encrypted share link for grandparents. This is a genuine unique selling point for your studio.<\/li>\n<li><strong>Publish as many galleries as you like<\/strong> \u2014 portraits, weddings, events, and specialised jobs like school and kindergarten photography.<\/li>\n<li><strong>Not just downloads.<\/strong> Your customers order real <strong>photo prints, wall art, canvas, gifts and digital downloads<\/strong> \u2014 you decide which products and at what price.<\/li>\n<li><strong>Full fulfilment through us.<\/strong> Order intake, <strong>payment processing<\/strong>, production and <strong>direct shipping to the end customer<\/strong> all happen through Portrait-Service. You never touch an order.<\/li>\n<li><strong>Monthly commission payout<\/strong> with a clear statement \u2014 you keep the margin between the lab price and your own sale price.<\/li>\n<li><strong>Access-protected galleries<\/strong> for sensitive jobs: public list, guest password or gallery code (ideal for schools and kindergartens).<\/li>\n<li><strong>Volume discounts (tiered prices)<\/strong> to encourage larger orders \u2014 shown to your customers automatically.<\/li>\n<li><strong>Edit only what actually sells.<\/strong> Upload your photos straight out of the camera and mark them as unedited. Customers see and order them as they are; you retouch just the ordered ones and upload the finished file, and only then does production start. A whole shoot no longer has to be retouched on spec.<\/li>\n<\/ul>\n\n<p><strong>What the plugin does in WordPress<\/strong><\/p>\n\n<ul>\n<li>Connect your Portrait-Archiv account in one step, or create a new <strong>free<\/strong> account right from WordPress \u2014 no tokens to copy.<\/li>\n<li>Manage galleries: create them, upload images, set visibility and edit title, date and price list. Uploads go into the gallery folder of your choice \u2014 pick an existing subfolder or name a new one \u2014 and you decide per upload whether the photos are finished or still to be edited.<\/li>\n<li>Manage price lists: your purchase price, your sale price and your net profit at a glance; add or remove products; set tiered prices.<\/li>\n<li>Embed a gallery with a Gutenberg block (just pick it from a dropdown) or a shortcode.<\/li>\n<li>Give the cart its own page - one block, and every cart link leads there.<\/li>\n<li>See how often each gallery was opened: a \"Views\" column in the gallery list and a day-by-day chart per gallery, with the visitors from your own website and those from Portrait-Archiv.com side by side.<\/li>\n<li>Make the galleries look like your website \u2014 without writing CSS: accent color for buttons, links and prices, preview images cropped to squares or shown as whole photos, their size, rounded or square corners, and what shows behind them. With a live preview right next to the settings.<\/li>\n<li>A modern, fast, mobile-friendly shop for your visitors; payment by prepayment or PayPal. Your public list of galleries is split into pages, so even a large archive opens quickly.<\/li>\n<\/ul>\n\n<p>More about the Portrait-Archiv photo reordering system:\nhttps:\/\/www.portrait-service.com\/portrait-archiv<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder 'portrait-archiv-shop' to wp-content\/plugins (or install it from the Plugins screen).<\/li>\n<li>Activate the plugin on the \"Plugins\" screen in the WordPress admin.<\/li>\n<li>Open \"Portrait-Archiv &gt; Account\" and connect your Portrait-Archiv account (sign in, or create a new account).<\/li>\n<li>Add a gallery to any page using the \"Portrait-Archiv: Gallery\" block or a shortcode.<\/li>\n<\/ol>\n\n<p>See \"Portrait-Archiv &gt; How-To\" after activation for a full walkthrough of every feature.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20earn%20money%20with%20this%3F\"><h3>How do I earn money with this?<\/h3><\/dt>\n<dd><p>You set your own sale price for every product. You keep the margin between the lab's production price and your sale price. Portrait-Service handles order intake, payment, production and shipping for you and pays out your earnings every month with a detailed commission statement. See portrait-service.com for the current terms.<\/p><\/dd>\n<dt id=\"what%20does%20it%20cost%3F\"><h3>What does it cost?<\/h3><\/dt>\n<dd><p>Creating a Portrait-Archiv.com account and using this plugin is free. There is no monthly fee; Portrait-Service earns through the production of ordered prints. You always define your own sale prices.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20portrait-archiv.com%20account%3F\"><h3>Do I need a Portrait-Archiv.com account?<\/h3><\/dt>\n<dd><p>Yes. The plugin is the WordPress front end for your Portrait-Archiv.com account. You can create a free account directly from the plugin (\"Account\" page) or connect an existing one \u2014 no tokens to copy.<\/p><\/dd>\n<dt id=\"can%20i%20use%20it%20for%20school%20and%20kindergarten%20photography%3F\"><h3>Can I use it for school and kindergarten photography?<\/h3><\/dt>\n<dd><p>Yes \u2014 that is one of the plugin's key strengths. You create the QR-code event and generate the per-child QR codes on Portrait-Archiv; embedding the gallery, the code entry and ordering then run through this plugin. Each child gets a personal code; parents see only their own child plus the group photos and never another family's children. The access check runs on the server (GDPR-friendly), and parents can share a 7-day, encrypted link with relatives.<\/p><\/dd>\n<dt id=\"can%20i%20use%20the%20plugin%20outside%20of%20germany%3F\"><h3>Can I use the plugin outside of Germany?<\/h3><\/dt>\n<dd><p>In principle yes. Please note, however, that some labs only ship photo prints, posters or canvases within Germany. Selling digital products is of course possible worldwide. To register a Portrait-Archiv.com account from abroad, please contact us via Portrait-Service.com.<\/p><\/dd>\n<dt id=\"how%20do%20i%20publish%20galleries%3F\"><h3>How do I publish galleries?<\/h3><\/dt>\n<dd><p>Open \"Portrait-Archiv &gt; Galleries\" and create a new gallery (optionally choosing a price list), then upload your images. Galleries you already published on Portrait-Archiv.com appear in the list automatically.<\/p><\/dd>\n<dt id=\"can%20i%20upload%20photos%20before%20i%20have%20edited%20them%3F\"><h3>Can I upload photos before I have edited them?<\/h3><\/dt>\n<dd><p>Yes. On the upload page you mark an upload as unedited. Customers see and order those photos as they are; each order containing one of them waits for you, and production starts once you have uploaded the retouched file. So you only edit the photos that actually sell. Customers are told in the shop that such an order takes a little longer \u2014 you can reword that notice under Settings. Finished and unedited photos can sit side by side in the same gallery.<\/p><\/dd>\n<dt id=\"can%20i%20sort%20a%20shoot%20into%20folders%3F\"><h3>Can I sort a shoot into folders?<\/h3><\/dt>\n<dd><p>Yes. Before uploading you pick the target folder: the gallery\u2019s main folder, an existing subfolder, or a new one you name right there. One folder per group, class or family keeps a large shoot tidy, and visitors switch between the folders inside the gallery.<\/p><\/dd>\n<dt id=\"can%20i%20see%20how%20often%20my%20galleries%20were%20opened%3F\"><h3>Can I see how often my galleries were opened?<\/h3><\/dt>\n<dd><p>Yes. \"Portrait-Archiv &gt; Galleries\" shows the views of the last 30 days per gallery, and every gallery has a statistics page with the daily course: visitors who came through your own website, visitors who came through Portrait-Archiv.com, and the orders of the same day \u2014 for 30, 90 or 365 days. A visitor counts once per gallery and browser session, so reloading a page does not inflate the number. The counting happens at Portrait-Archiv, so both routes are measured the same way and the plugin only displays the result.<\/p><\/dd>\n<dt id=\"i%20published%20a%20new%20gallery%20but%20it%20does%20not%20show%20up\"><h3>I published a new gallery but it does not show up<\/h3><\/dt>\n<dd><p>The plugin keeps a small local cache to speed up page loads and avoid unnecessary requests. Galleries are synced automatically in the background (the interval is configurable under \"Portrait-Archiv &gt; Settings\"). For an immediate update, click \"Refresh galleries now\" on the Settings page.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>4.7.0<\/h4>\n\n<ul>\n<li>Security: galleries you marked as inactive or password-protected are now really protected. The display setting you choose per gallery was only applied to the page WordPress renders - the interface the photo grid talks to did not check it, so a gallery could be opened without its guest password, and a link to a single photo could be pointed at a different gallery than the one embedded on the page. Both paths are now checked on the server: a protected gallery only opens once the guest password or gallery code has been entered, an inactive one does not open at all, and a single-photo link stays inside the gallery it belongs to. Public galleries and the gallery list are unaffected. Nothing to configure - please update.<\/li>\n<li>Security: access codes and guest passwords can no longer be guessed by trying. Entering a wrong code now counts against a limit - after ten failed attempts the form asks you to wait a few minutes, and a correct code resets the counter, so a family unlocking several children is never locked out. In QR code events the personal code of a child is now stored encrypted in the browser instead of merely signed; anyone who still has an older one simply enters the code once more. Ordering and visit reporting are capped the same way, so neither can be triggered in bulk from outside.<\/li>\n<li>Security: updating no longer risks your gallery settings. Re-activating the plugin on an installation coming from the old 3.7 line dropped and recreated its tables - which is where the display mode and the guest password of every gallery live. The update now only ever adds what is missing.<\/li>\n<li>New \"Help &amp; support\" tab under How-To. If something is unclear or does not work, you now have a way to reach us from inside WordPress instead of having to work around it. Account, order and payout questions go straight to us by e-mail; questions about the plugin itself are best placed in the WordPress.org support forum, where other photographers can read the answer too. Feature requests are explicitly welcome - a good part of what this plugin does today started as a photographer's request. The e-mail links come with the subject and a short outline already filled in (which gallery, what you did, what you expected), so a single message is usually enough.<\/li>\n<li>The \"Get your photo shop live in 4 steps\" checklist now disappears once you are set up. Its last step - embedding a gallery on a page - had no detection at all and could never be ticked off, so the start page kept explaining the first steps to photographers who had been selling for months. The plugin now sees when a gallery, the public list or a code form is embedded somewhere, and makes room for the actual content. The walkthrough stays available under \"How-To\".<\/li>\n<li>The gallery list in your dashboard reads cleanly again. The \"Visibility\" column showed the full sentence from the settings dropdown, which did not fit the column and ran across the actions next to it. It now shows a short status - Inactive, Guest password, Gallery code, Public, Public + password - with the full wording as a tooltip, and the columns are sized so title and actions have room.<\/li>\n<\/ul>\n\n<h4>4.6.0<\/h4>\n\n<ul>\n<li>Shipping costs are no longer a surprise at the end. While browsing, the image view now shows the cart as a subtotal with the shipping on its own line right underneath, so nobody has to guess whether shipping is still to come; where shipping costs nothing, it says so instead of showing \"0.00\". The cart page also names the country the shipping was calculated for, recalculates as soon as a different country is chosen, and says plainly when the items cannot be shipped there - previously it always quoted the German rate and a failed calculation could even read as free shipping. The cart button above the photos now shows just the number of items: a price there was a number without context, since it is the picture and the cart that carry the prices.<\/li>\n<li>Browsing galleries feels quicker and works the way a phone should. Turning to the next page used to do nothing visible until the server answered, and then the whole grid jumped into place; the page now fills with grey placeholders the moment you click, in the same size and shape as the photos, so nothing shifts around once the pictures arrive. In the image view you can swipe left and right to move between photos instead of aiming for the small arrows - the arrows and the arrow keys keep working as before, and swiping up and down still scrolls as usual.<\/li>\n<li>A link to a single photo works again. Sharing or bookmarking one photo used to open a page with an empty frame - no title, no photo, no product list. Such a link now opens the gallery and shows that photo right away in the normal image view, with product choice, cart and the arrows to browse on. Galleries that are inactive or password-protected stay that way: the link leads to the password prompt, not past it.<\/li>\n<li>The public gallery list is much faster and no longer chokes on large archives. It used to load every single gallery in full - images and price list - just to show a title and a preview, so a site with a few hundred galleries took forever to appear. Titles and links now come straight from WordPress and are there instantly (search engines finally see them, too), the list is split into pages - you decide how many galleries per page under Settings - and a preview image is only fetched for the galleries a visitor actually scrolls to.<\/li>\n<li>You can now adapt the look of your galleries to your own website, without writing a single line of CSS: pick an accent color for buttons, links and prices, decide whether preview images are cropped to squares or shown as whole photos (portraits are no longer cut off), choose how large the photos appear in the grid, switch corners between softly rounded and square, and let your own page background show through behind the photos. Everything sits under Settings, with a live preview next to the controls, and the text on colored buttons switches between white and dark on its own so it always stays readable. Galleries you never touch keep exactly the look they have today.<\/li>\n<li>You can now see how often each gallery was opened, without leaving WordPress. The gallery list has a \"Views\" column for the last 30 days, and every gallery has a statistics page: a chart of the daily course, the two access routes side by side - visitors who came through your own website and visitors who came through Portrait-Archiv.com - and the orders of the same day, for 30, 90 or 365 days. The numbers are the ones Portrait-Archiv keeps for both routes; WordPress deliberately keeps no second count of its own, because two counts would inevitably drift apart (caching, bots, deleted cookies) and each would only ever see one channel.<\/li>\n<li>Visits to your galleries on your own website are now reported to Portrait-Archiv, so the gallery statistics there finally show them. Until now that column stayed empty: the plugin caches its gallery requests, so no matter whether one visitor came or a hundred, Portrait-Archiv saw at most one request every five minutes. A visit is now counted once per gallery and browser session, at the moment a visitor actually enters the gallery - not when a preview image loads in the gallery list, and in a QR-code event only once the access code has been entered. The report is sent in the background and never delays your page, and a session cookie (<code>pawps_visits<\/code>) makes sure the same visitor is not counted twice; it holds no personal data.<\/li>\n<\/ul>\n\n<h4>4.5.0<\/h4>\n\n<ul>\n<li>In a QR-code event, you can now decide what visitors see first: the photos of their own children, or the group photos. Until now the group photos always came first, so parents had to scroll past them to reach the pictures they entered the code for. The new default is children first; switch it under Settings if you prefer it the other way round. Paging and the arrows in the image view follow the order you chose.<\/li>\n<li>Student ID cards can now be ordered from your website. Until now they behaved like an ordinary print: the customer could buy one, but the details that belong on the card - name, class, date of birth - were never asked for, so the order arrived unproducible. Cards now open a form with exactly the fields you defined in your card template, and a live preview shows the finished card while the customer types. Cards only appear in galleries you assigned a template to, and only on portrait photos - a landscape shot would end up on the card in the wrong proportions. The entered details are listed in the cart, so nobody orders a card with a typo in the name.<\/li>\n<\/ul>\n\n<h4>4.4.0<\/h4>\n\n<ul>\n<li>The cart can now live on a page of its own: add the \"Portrait-Archiv: Cart\" block to a page and every cart link leads there, so you can put \"Cart\" in your menu. Until now the cart took over whichever gallery page the visitor happened to be on \u2014 the page title then said one thing while the content showed another. Nothing changes for existing sites without such a page.<\/li>\n<li>Customers now see a note on photos you uploaded as unedited - in the image view and in the cart - so nobody is surprised that such an order takes a little longer. The wording is yours: leave it as it is, or write your own under Settings.<\/li>\n<li>Photos can now be uploaded into a subfolder of a gallery. Until now every upload landed in the gallery\u2019s main folder, no matter how big the shoot was. The upload page now offers the gallery\u2019s existing folders and lets you create a new one by simply typing its name - one folder per group, class or family, for example. Visitors switch between the folders inside the gallery.<\/li>\n<li>New: you can mark an upload as unedited and retouch each photo only after it has been ordered. Customers see and order the photos as they are; every order containing an unedited photo then waits for you, and production starts once you have uploaded the finished file. That saves editing a whole shoot up front - you only work on what actually sells. The upload page explains the workflow, remembers your choice per gallery and marks such galleries in the list. Both states can be mixed inside one gallery.<\/li>\n<li>Adding a photo to the cart is now clearly confirmed. Until now the confirmation appeared as a small note at the very bottom of the browser window - several hundred pixels away from the button you had just clicked in the image view - and disappeared after two seconds. Many customers never saw it and were left unsure whether the item had been added at all. The button itself now confirms the success, and a permanent cart line appears right underneath it: number of items, total, and a link straight to the cart.<\/li>\n<li>Fixed: the cart columns were all left-aligned. A base rule for table cells (<code>[data-pawps-basket] td<\/code>) outweighed the alignment helper classes the templates were setting, so quantities, unit prices, totals and the subtotal block all sat on the left - and prices no longer lined up at all once one of them reached two digits. Prices now sit right-aligned with fixed-width digits, and the subtotal lines sit next to their amounts.<\/li>\n<li>The quantity of a digital download is shown in the same kind of field as an editable quantity, just not editable. It stays fixed at one per photo, as before, but a bare number sat visibly offset from the input fields in the rows above and below it. The number itself is shown in full contrast - dimming the whole field made it hard to read.<\/li>\n<li>The payment method selection is styled at all now. It had no styling whatsoever, so the browser drew a default fieldset and ran the radio button, its label and its description together into one block of text - the description ended up under the radio button instead of under the label it belongs to. Each method is now a clickable card with the description beside the radio button, and the selected one is highlighted. The bank details on the order confirmation got the same treatment.<\/li>\n<\/ul>\n\n<h4>4.3.3<\/h4>\n\n<ul>\n<li>Fixed: with the gallery list on your front page, clicking a gallery showed your blog posts instead of the gallery. The plugin registered its own URL parameters as WordPress query variables; that makes WordPress leave a static front page and fall back to the post list. No code ever read them that way, so they are gone.<\/li>\n<li>The gallery code and guest password forms now look like the rest of the shop. They were plain unstyled forms carrying a WordPress admin button class that does nothing on the front end, so they showed up as bare browser defaults next to the styled gallery. Both now use the same card layout as the QR code prompt, and an error message appears inside that card.<\/li>\n<li>The gallery list is centred. Cards used to stretch across the full row, which made a single gallery enormous and a half-filled last row look pushed to the left. Cards now keep their size and the row is centred - one gallery sits in the middle, two sit side by side.<\/li>\n<\/ul>\n\n<h4>4.3.2<\/h4>\n\n<ul>\n<li>Galleries are no longer squeezed into the text column. The gallery and gallery-list blocks now offer WordPress's standard \"Wide width\" and \"Full width\" settings from the block toolbar, and use wide by default. Modern block themes give ordinary page content only around 620 pixels \u2014 too narrow for the thumbnail grid, and narrow enough that the two-column image detail view collapsed into one. Existing gallery blocks pick up the wider layout automatically; use the block toolbar to change the width of an individual block, or the shortcode if you want the plain content width.<\/li>\n<li>Fixed: a gallery list that could stay empty after a failed update. The plugin remembers when it last fetched your galleries so it only has to ask for what changed. That marker was moved forward even when the request had failed - after which every unchanged gallery counted as \"already known\" and was skipped, and the list stayed empty until you happened to edit a gallery. The marker now only moves after a successful fetch, and an empty local list always triggers a full fetch, so an affected site repairs itself on the next update.<\/li>\n<li>Fixed: entering a wrong gallery code or guest password now tells you so. The message was there in the code but never reached the page - the form simply came back blank, which looked like the site was broken.<\/li>\n<li>Fixed: on a WordPress that stores its data in SQLite instead of MySQL, the plugin failed to create one of its own tables, and the whole front end came up empty - gallery lists, embedded galleries and gallery codes all reported that the gallery was not available, while the admin screens looked perfectly fine because they read live from Portrait-Archiv. One column used the MySQL type name LONG, which the SQLite driver rejects. Existing sites are repaired on update; your per-gallery visibility settings and guest passwords are kept.<\/li>\n<\/ul>\n\n<h4>4.3.1<\/h4>\n\n<ul>\n<li>The checkout no longer asks customers to \u201caccept\u201d the privacy policy: the policy is still shown in full before ordering, but as information rather than a tick box. Its purpose is to tell you how your order data is handled, which is required by law anyway \u2014 you cannot decline it and still order, so demanding a tick was misleading. The terms and conditions still require an active tick, as before.<\/li>\n<li>Sign-up now asks you to accept Portrait-Service's terms and conditions: the \u201ccreate a free account\u201d form has a required checkbox with a link to the terms, and the account is only created once you have ticked it. Signing up through the plugin concludes a contract with Portrait-Service, so you should see the terms first. Your data is handled as described in the linked privacy policy \u2014 that is information, not something you have to tick.<\/li>\n<li>Price lists now load through Portrait-Archiv\u2019s dedicated price list interface. Your lists, prices, volume discounts and product sets are unchanged \u2014 but the plugin now gets a precise answer when something goes wrong, instead of a generic failure it has to guess about.<\/li>\n<li>Clearer message on the price list page when your account link has not been confirmed yet: you are told to confirm the activation email, instead of being shown an empty list that looks like you have no price lists.<\/li>\n<\/ul>\n\n<h4>4.3.0<\/h4>\n\n<ul>\n<li>Protected image delivery: photos are now served through signed, short-lived image addresses. Copying an image URL out of a gallery no longer gives lasting access \u2014 the address stops working after a few hours. This matters most for school and kindergarten photography, where a child's portrait must not stay reachable for anyone who once got hold of the link.<\/li>\n<li>The plugin now ties its own caching to the lifetime of those image addresses. Cached gallery data and link previews (Open Graph \/ Twitter cards) can never hand out an address that the image server has already stopped accepting, so preview images in messengers and social networks keep working.<\/li>\n<\/ul>\n\n<h4>4.2.0<\/h4>\n\n<ul>\n<li>QR code events (school &amp; kindergarten photography): galleries where every child has its own password-protected folder are now fully supported. Visitors first enter the personal access code from their child's photo card; only then are that child's photos and the group photos shown \u2014 together, as one simple gallery (no folder navigation). Parents with several children in the same class can add each code and see all of their photos at once.<\/li>\n<li>Privacy by design (GDPR): for QR code galleries the plugin never reveals protected folders, image lists, thumbnails or single images before a valid code has been entered \u2014 the access check is enforced on the server, one child's code never unlocks another child, and such galleries can no longer be added to the public gallery list.<\/li>\n<li>Share link for QR galleries: the \u201cShare gallery\u201d button now creates a link that opens the unlocked photos directly for the recipient (e.g. to share with grandparents) \u2014 valid for 7 days, encrypted so the actual access code is never exposed in the link.<\/li>\n<li>Digital downloads are now limited to one per photo: the quantity is fixed at 1 in the order dialog and in the cart (you can't order the same download of a photo multiple times). Enforced on the server as well.<\/li>\n<li>Volume discounts are now applied reliably in the order dialog even when a product has several price tiers (the correct tier price is always shown for the chosen quantity).<\/li>\n<li>The image lightbox now steps through photos smoothly with the arrows\/keyboard, wrapping around at the first and last image instead of showing a \u201ccould not load the image\u201d error at the ends.<\/li>\n<li>On the gallery-code page, visitors can now reset an entered code and enter a different one (the \u201cswitch gallery\u201d link works there too).<\/li>\n<li>Product sets (bundles): photographers can now offer several products as one package with a single fixed price, right in the pricelist editor. Customers buy the set in the shop; multi-motif sets open a configurator to assign photos to the parts of the set.<\/li>\n<li>Set configurator: the photo picker now offers subfolder selection and pagination just like the normal gallery view, and the cancel \/ add-to-cart buttons sit directly below the set's items (before the photos) instead of getting lost at the bottom.<\/li>\n<li>Pricelist editor: products and articles are now sorted alphabetically (letters before numbers), so e.g. \"Fotoabz\u00fcge\" comes first and \"16 Fotosticker\" last instead of the raw catalog order.<\/li>\n<li>Pricelist editor &amp; shop: products are now grouped by article category (in the category order from your lab cockpit), with clear category headings in the editor and category groups in the shop's product picker.<\/li>\n<li>Shop: the image lightbox (add-to-cart) now has a solid, high-contrast panel so the gallery title, product and price are always clearly readable.<\/li>\n<\/ul>\n\n<h4>4.1.0<\/h4>\n\n<ul>\n<li>German is now bundled in both address styles \u2014 informal (\"du\", de_DE) and formal (\"Sie\", de_DE_formal). WordPress automatically serves the variant matching your site language.<\/li>\n<li>Localized plugin title for better discoverability in the German plugin directory and search.<\/li>\n<\/ul>\n\n<h4>4.0.1<\/h4>\n\n<ul>\n<li>The \u201cConnect your Portrait-Archiv account\u201d admin banner can now be dismissed permanently (per user) \u2014 handy for demo or test installs that will never be connected.<\/li>\n<\/ul>\n\n<h4>4.0<\/h4>\n\n<p>Major rebuild \u2014 your Portrait-Archiv.com account becomes a cockpit inside WordPress.<\/p>\n\n<ul>\n<li>Connect in one step: create a free Portrait-Archiv account or link an existing one, right from WordPress (no tokens to copy).<\/li>\n<li>Manage galleries in WordPress: create galleries, upload images, edit title, date and price list, and set each gallery's visibility (public list, guest password or gallery code).<\/li>\n<li>New: choose the default visibility for newly imported\/created galleries under Settings \u2014 so a new gallery is live right away instead of hidden.<\/li>\n<li>Manage price lists: see your purchase price, your sale price and your net profit per product at a glance; add or remove products.<\/li>\n<li>New: tiered (volume) prices per product. The shop applies the cheaper unit price automatically and shows the available discounts to your customers to encourage larger orders.<\/li>\n<li>Modern, fast, mobile-friendly gallery and shop. Embed a gallery with a Gutenberg block (pick it from a dropdown) or a shortcode.<\/li>\n<li>Checkout with prepayment or PayPal; availability and fees are determined on the backend.<\/li>\n<li>Only active galleries are shown; hardened security throughout.<\/li>\n<li>Passes the official WordPress Plugin Check with zero errors and zero warnings.<\/li>\n<li>Requires WordPress 6.2+ and PHP 8.1+ (tested up to WordPress 7.1).<\/li>\n<\/ul>\n\n<h4>3.7<\/h4>\n\n<ul>\n<li>Bugfix f\u00fcr \u00dcbertragung der Bestellung<\/li>\n<\/ul>\n\n<h4>3.5<\/h4>\n\n<ul>\n<li>Stabilit\u00e4t verbessert<\/li>\n<\/ul>\n\n<h4>3.1<\/h4>\n\n<ul>\n<li>kleine Anpassungen f\u00fcr Wordpress 5<\/li>\n<\/ul>\n\n<h4>3.0<\/h4>\n\n<ul>\n<li>Anbindung der neuen REST-API von Portrait-Archiv.com<\/li>\n<li>Umstellung auf JQuery und Bootstrap im Frontend<\/li>\n<li>starke Performanceoptimierung<\/li>\n<li>kleine Bugfixes im t\u00e4glichen Update der Galerien<\/li>\n<li>Reduzierung der lokalen Datenhaltung auf ein Minimum<\/li>\n<\/ul>\n\n<h4>2.3<\/h4>\n\n<ul>\n<li>Optimierung der Cron-Jobs zur aktualisierung der Galerien<\/li>\n<li>Entfernung von Verwendung von deprecated Methoden<\/li>\n<li>kleine Bugfixes im Adminbereich<\/li>\n<li>Zahlungsweise PayPal nur noch anbieten wenn Rechnungsbetrag &gt; 0 Euro<\/li>\n<li>Anpassungen f\u00fcr neue Wordpress-Modulverzeichnis<\/li>\n<\/ul>\n\n<h4>2.2.3<\/h4>\n\n<ul>\n<li>kleine Bugfixes in Verbindung mit PHP 7<\/li>\n<li>Sortierung der Galerieliste nach Datum<\/li>\n<\/ul>\n\n<h4>2.2<\/h4>\n\n<ul>\n<li>Bereitstellung des Buttons zur Tagerstellung im Editor<\/li>\n<li>neue TLDs als valide Domains hinzugenommen<\/li>\n<li>kleine Anpassungen im Layout<\/li>\n<\/ul>\n\n<h4>2.1.3<\/h4>\n\n<ul>\n<li>Bugfix bei t\u00e4glichem Shooting-Refresh<\/li>\n<\/ul>\n\n<h4>2.1<\/h4>\n\n<ul>\n<li>technische Backendumstellung<\/li>\n<li>Anbindung der Schweizer Niederlassung<\/li>\n<li>Einbindung von PayPal als Zahlungsweise<\/li>\n<li>neues zus\u00e4tzliches Bootstrap-Template (Responsive Design) <\/li>\n<\/ul>\n\n<h4>1.7<\/h4>\n\n<ul>\n<li>erste Vorbereitungen f\u00fcr Relaunch von Portrait-Archiv.com<\/li>\n<\/ul>\n\n<h4>1.6.4<\/h4>\n\n<ul>\n<li>kleiner Bugfix bei Rundungen im Warenkorb<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>kleiner Bugfix bei CURL Verbindungen<\/li>\n<\/ul>\n\n<h4>1.6<\/h4>\n\n<ul>\n<li>Fallbackl\u00f6sung falls Serverkonfiguration Remotezugriff nicht erlaubt<\/li>\n<\/ul>\n\n<h4>1.5<\/h4>\n\n<ul>\n<li>Anzeige der Galerien mit Unterordnern erm\u00f6glicht<\/li>\n<\/ul>\n\n<h4>1.4<\/h4>\n\n<ul>\n<li>neues Template-Tag - Einbindung \u00fcber Galeriecode<\/li>\n<li>Template-Editor - Erstellen Sie direkt online Ihre eigenen Templates<\/li>\n<li>Korrektur kleinerer Fehler<\/li>\n<\/ul>\n\n<h4>1.3<\/h4>\n\n<ul>\n<li>kleine Fixes<\/li>\n<\/ul>\n\n<h4>1.2<\/h4>\n\n<ul>\n<li>kleine Performanceoptimierungen<\/li>\n<li>Er\u00f6ffnung eines Portrait-Archiv.com Accounts direkt \u00fcber das Modul<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>kleine Anpassungen im Default-Template<\/li>\n<li>Erweiterung der Readme zur Anzeige der Bilder im Pluginverzeichnis<\/li>\n<\/ul>\n\n<h4>1.0<\/h4>\n\n<ul>\n<li>erste initiale Ver\u00f6ffentlichung<\/li>\n<\/ul>","raw_excerpt":"Sell your photos from WordPress: create client galleries, set your own prices, and let customers order prints, wall art and downloads.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/54610","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=54610"}],"author":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/tschiffler"}],"wp:attachment":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=54610"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=54610"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=54610"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=54610"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=54610"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=54610"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}