Beschreibung

WooCommerce kennt am Produkt nur einen Betrag. Dieses Plugin gibt jedem Produkt seine eigene Preis-Einheit (pro Monat, pro Tag, pro m²) und hängt sie überall an den Preis: Shop-Liste, Produktseite, Warenkorb, Bestellung und E-Mails. Bei „pro m²“ rechnet die Einheit: Die Kundschaft gibt neben der Menge die Fläche je Stück ein, der Shop zeigt sofort den Gesamtpreis, und Mindest- und Höchstfläche lassen sich je Produkt festlegen. Bei Produkten mit Varianten bringt jede Variante ihre eigene Einheit über den Wert eines Attributs mit: Ein Abo mit den Laufzeiten monatlich, halbjährlich und jährlich bleibt ein Produkt, und jede Laufzeit trägt „pro Monat“, „pro Halbjahr“ oder „pro Jahr“.

Produkte lassen sich zusätzlich als Abo kennzeichnen. Die Vertragsbedingungen stehen in den Attributen des Produkts, etwa Laufzeit, Verlängerung und Kündigungsfrist, und jeder Wert trägt seine Bedeutung als Zahl. Daraus rechnet das Plugin Laufzeiten, Verlängerungen und bei einer Kündigung das Vertragsende; Produktseite, Bestellung und Kundenkonto nennen dieselben Bedingungen. Der Status des Abos ist der Status der Bestellung: Das Team setzt „Abo aktiv“, sobald der Vertrag in der Buchhaltung steht, und jeder Wechsel löst die passende E-Mail aus. Die Kundschaft sieht ihre Laufzeiten im Konto und kündigt dort. Das Vertragsende steht schon vor dem Absenden fest und kommt sofort als Bestätigung per E-Mail. Abgerechnet wird außerhalb von WooCommerce: Der Shop spiegelt den Vertrag, er führt ihn nicht.

Changelog

v0.14.0

Hinzugefügt

  • Platzhalter im Feld „Fläche in m²“ (#19, Joerg, 27.09.2026): je Produkt im Reiter „Abo & Einheit“, etwa „z. B. 400“ bei der Fassade und „z. B. 12,5“ beim Bodenaufkleber. Leer gilt der Standard unter Einstellungen, ausgeliefert „z. B. 100“. idf-woo-addons zeigt ihn ab v0.31.0 in seinem Feld.

v0.13.0

Geändert

  • Fläche und Gesamtpreis im Design der Addons (#19, Joerg, 27.09.2026): Läuft idf-woo-addons ab v0.30.0, rendert es Feld „Fläche in m²“ und Gesamtpreis in seinem Feldblock, gestaltet unter Woo Addons → Design. Dieses Plugin zeigt sein eigenes Feld nur noch ohne idf-woo-addons.

Hinzugefügt

  • Filter idf/woo-subscriptions/area_field liefert die Daten des Flächenfelds (Grenzen, Beschriftung, Einheit), idf/woo-subscriptions/render_area_field sagt, ob ein anderes Plugin es rendert.

v0.12.0

Hinzugefügt

  • Fläche neben der Menge (#19): Bei Produkten mit „pro m²“ gibt die Kundschaft auf der Produktseite die Fläche je Stück ein, Pflichtfeld mit zwei Nachkommastellen. Der Preis je Stück ist Fläche mal Preis je m², die Menge zählt die Stücke: 2 × 400 m² zu 142,00 € sind 113.600,00 €.
  • Die Summe steht schon auf der Produktseite, sobald Fläche und Variante gewählt sind.
  • Mindest- und Höchstfläche je Produkt im Reiter „Abo & Einheit“, leer heißt ohne Grenze. Eine Fläche außerhalb weist das Feld ab, der Warenkorb in jedem Fall, auch im Block-Warenkorb.
  • Warenkorb, Bestellung, Mails, Kundenkonto und Backend zeigen die Zeile „Fläche“ an der Position. Dasselbe Produkt mit anderer Fläche wird eine eigene Position, „Erneut bestellen“ übernimmt die Fläche.
  • Die Ability list-units nennt je Einheit ihre Größe (dimension).

Geändert

  • Einheiten haben eine Bedeutung: Zeitraum, Größe oder nur Beschriftung, in einer Auswahl auf der Seite „Einheiten“. Bisher gab es nur den Zeitraum, und „pro m²“ war ein Wort am Preis. Beim Update bekommen Einheiten wie „pro m²“ einmal die Größe Fläche.
  • An einer Position mit Fläche hängt kein „pro m²“ mehr am Preis, weil er schon für die ganze Fläche gilt.

v0.11.0

Hinzugefügt

  • Laufzeiten im Kundenkonto (#18): eine Tabelle mit erster Laufzeit, jeder Verlängerung bis zur laufenden und der nächsten, je mit Zeitraum und Stand.
  • Bedeutung an den Werten der Vertrags-Attribute: je nach Rolle die Dauer (etwa 1 Jahr), die Verlängerung (keine, um die gleiche Laufzeit, um eine eigene Dauer) oder die Kündigungsfrist (0 heißt bis zum letzten Tag).
  • Der Kauf speichert den Vertrag auch als Daten an der Bestellung, damit er rechenbar bleibt und der spätere Abgleich mit dem Nexus ihn lesen kann (#2).

Geändert

  • Das Plugin rechnet den Vertrag (Joerg, 26.09.2026: „sauber und nachhaltig“): Laufzeiten, Verlängerungen und bei einer Kündigung das Vertragsende. Bisher waren die Bedingungen nur Text, und das Team ermittelte das Ende selbst.
  • Kündigung im Kundenkonto sofort bestätigt: Das Formular nennt vorher das Vertragsende, die Bestellung geht direkt auf „Abo gekündigt“, die Kundschaft bekommt Eingang und Ende per Mail, das Team seinen Arbeitsauftrag mit demselben Datum.
  • Team setzt „Abo gekündigt“ ohne Datum: Das Plugin rechnet das Ende ab dem Eingang der Kündigung, ein eingetragenes Datum geht vor. Der Kasten in der Bestellung zeigt vorher, welches Ende eine Kündigung heute ergäbe.
  • Keine Bestätigung ohne Datum: „Kündigung bestätigt“ (bisher „Vertragsende bestätigt“) geht nur mit Vertragsende raus, sonst nennt eine Bestellnotiz, was fehlt. „Das genaue Vertragsende teilen wir Ihnen gesondert mit“ gibt es nicht mehr.
  • Rollen statt Hakenliste: In den Einstellungen bekommt je ein Attribut eine Rolle: Laufzeit, Verlängerung, Kündigung. Beim Update werden sie aus der bisherigen Liste übernommen.
  • Name aus der Bedeutung: Den Namen eines Vertragswerts setzt das Plugin beim Speichern, etwa „jährlich“ oder „Zum Ende der Laufzeit, Frist 30 Tage“; der Slug bleibt. Beim Update wird aus „Automatisch“ „Automatisch um die gleiche Laufzeit“.
  • Ein Abo braucht einen rechenbaren Vertrag: alle drei Attribute, jeder Wert mit Bedeutung. Der Reiter „Abo & Einheit“ zeigt je Variante, wie das Plugin rechnet.
  • „Ihr Abo ist aktiv“ nennt das Ende der ersten Laufzeit und die Verlängerung.
  • „Kündigung eingegangen“ und die Eingangsbestätigung bleiben nur für Bestellungen, die vor v0.11.0 gekauft wurden; dort bleibt das Vertragsende von Hand.

Behoben

  • Monatsenden laufen nicht mehr über: der 31.01. plus ein Monat ist der 28. bzw. 29.02., nicht der 03.03.

v0.10.0

Geändert

  • Der Status eines Abos ist der Status seiner Bestellung (#16, Joergs Entscheidung vom 26.09.2026). Neue Bestellstatus „Abo aktiv“, „Kündigung eingegangen“ und „Abo gekündigt“ stehen in der normalen Status-Auswahl, in der Bestellliste und in deren Filtern. Sie zählen als bezahlt. Bisher stand der Status nur im Kasten unter der Bestellung, und der Bestellstatus wusste nichts davon.
  • Aktiv setzt das Team von Hand, sobald der Vertrag in der Buchhaltung steht. Bis dahin sagt das Kundenkonto „Noch nicht aktiv“, und kündigen lässt sich das Abo noch nicht. Der Tag des ersten „Abo aktiv“ ist der Beginn des Abos (bisher das Bestelldatum).
  • Der Kasten in der Bestellung heißt „Abo in dieser Bestellung“ und pflegt nur noch das Vertragsende. „Abo gekündigt“ setzt man oben im Status, das Vertragsende im selben Speichern; dann nennt die Bestätigung das Datum.
  • „Abo kündigen“ ist ein Button im Stil des Themes, der das Formular öffnet; bisher ein aufklappbarer Text, der unterging. Ohne JavaScript steht das Formular gleich offen.
  • „Abbrechen“ fragt nach: Bei einer unbezahlten Abo-Bestellung fragt „Abbrechen“ im Kundenkonto vorher, ob die Bestellung wirklich storniert werden soll. Bisher stornierte WooCommerce beim ersten Klick.
  • Ein Abo je Bestellung: Ein Abo-Produkt ist einzeln verkauft (Menge 1), kommt nur in einen leeren Warenkorb, und neben einem Abo nimmt der Warenkorb nichts anderes an, im klassischen wie im Block-Warenkorb. Ein trotzdem gemischter Warenkorb kommt nicht durch die Kasse.
  • Die Übersicht hebt neben offenen Kündigungen die Abos hervor, die auf „Abo aktiv“ warten. Eine stornierte, erstattete oder fehlgeschlagene Bestellung zeigt ihr Abo als „Storniert“.
  • Die Spalte „Abo“ in der Bestellliste des Kundenkontos entfällt; die Status-Spalte der Bestellung sagt jetzt dasselbe.
  • _idf_sub_status an der Position wird nicht mehr geschrieben und nicht mehr gelesen. Abo-Bestellungen von vorher gelten als noch nicht aktiv, bis das Team sie auf „Abo aktiv“ setzt.
  • Hilfe-Seite, Übersicht, README und DSGVO-Seite beschreiben den neuen Ablauf.

Hinzugefügt

  • Mail „Abo: Ihr Abo ist aktiv (Kunde)“ beim Wechsel auf „Abo aktiv“, unter WooCommerce → Einstellungen → E-Mails wie die drei übrigen. Alle vier hängen am Wechsel des Bestellstatus, egal ob er aus dem Backend, dem Kundenkonto oder über die REST-API kommt.

v0.9.1

Behoben

  • Die Preis-Einheit aus dem Reiter „Abo & Einheit“ passte nicht zu Varianten mit eigener Einheit (#14). Beim Testprodukt mit monatlich, halbjährlich und jährlich stand „pro Monat“ an der Preisspanne des ganzen Produkts, also an „89,00 € bis 1.068,00 €“, zu sehen etwa in der Produktliste im Backend.
  • Unterscheidet ein Attribut mit Einheiten die Varianten, trägt die Preisspanne nur noch eine Einheit, wenn alle Varianten dieselbe haben; sonst keine. Varianten werden dafür nur bei solchen Produkten geladen, Kleidung und Folien bleiben unberührt.
  • Kommt die Einheit ganz aus Attributwerten, zeigt der Reiter statt der Auswahl die Einheit je Variante bzw. die des Werts. Beim nächsten Speichern wird eine alte Einheit am Produkt geleert. Trägt nur ein Teil der Varianten eine eigene Einheit, bleibt die Auswahl mit dem Hinweis, dass sie nur für die übrigen gilt.
  • get-product-units nennt für so ein Produkt source attribute und die gemeinsame Einheit, sonst keine.

v0.9.0

Geändert

  • Der Vertrag steht nur noch in den Attributen (#12, Joergs Entscheidung vom 26.09.2026). Bisher standen die Bedingungen an zwei Stellen: als Attribute auf der Produktseite und als Felder Mindestlaufzeit und Kündigungsfrist im Plugin, und nur die Felder gingen in den Vertrag. Beim WordPress-Service Basis wichen beide voneinander ab.
  • Neue Einstellung Vertrags-Attribute: Dort werden die globalen Attribute angehakt, die den Vertrag bilden, etwa Laufzeit, Verlängerung und Beendigung. Beim Kauf übernimmt das Plugin ihren Wortlaut an die Bestellposition (_idf_sub_contract). Warenkorb, Kasse, Bestellung, Kundenkonto, Backend und E-Mails zeigen dieselben Texte wie die Produktseite.
  • Die Felder Mindestlaufzeit und Kündigungsfrist im Reiter „Abo & Einheit“ entfallen. Der Reiter zeigt jetzt nur zum Lesen, was in den Vertrag geht, was fehlt und welche Einheit jede Variante trägt.
  • Der Haken „Abo-Produkt“ hält nur, wenn das Produkt alle Vertrags-Attribute trägt und eine Einheit mit Zeitraum hat. Sonst nennt WooCommerce nach dem Speichern den Grund.
  • Die Einheit kommt auch bei einem Produkt ohne Varianten aus dem Attributwert, wenn das Attribut dort genau einen Wert trägt, etwa „Laufzeit: monatlich“. Sie geht dem Feld „Preis-Einheit“ vor, und der Reiter sagt das.
  • Die Auflösung der Einheit liest nur noch Attribute, von denen ein Wert überhaupt eine Einheit trägt. Varianten von Kleidung und Folien kosten dadurch keine Abfragen mehr; v0.8.0 fragte bei jeder Variante nach.
  • Der eigene Vertragshinweis unter dem Preis auf der Produktseite entfällt (#10). Die Bedingungen sind Attribute, und die zeigt das Theme oder ein Attribut-Filter.
  • Übergang: Ein Produkt mit alten Zahlen und noch ohne Vertrags-Attribute behält Mindestlaufzeit und Kündigungsfrist im Vertrag, bis es umgestellt ist. Der Reiter zeigt sie als „Altbestand“, beim Speichern mit Vertrags-Attributen werden sie entfernt. Bestellungen von vorher behalten ihre Angaben.
  • Ohne bekannten Zeitraum heißt es „1 Abrechnungszeitraum“ statt einer nackten „1“.
  • Hilfe-Seite, erste Schritte, README und DSGVO-Seite beschreiben den Vertrag aus den Attributen.

v0.8.0

Hinzugefügt

  • Einheit am Attributwert (#11). Jeder Wert eines globalen Produkt-Attributs hat auf seiner Seite unter Produkte > Eigenschaften ein Feld „Preis-Einheit“. Eine Variante mit diesem Wert bekommt dann diese Einheit statt der Einheit am Eltern-Produkt: am Preis, im Warenkorb, im Vertrag beim Kauf und in get-product-units. So wird ein Abo mit den Varianten monatlich, halbjährlich und jährlich ein Produkt, dessen Varianten „pro Monat“, „pro Halbjahr“ und „pro Jahr“ tragen.
  • Neuer Zeitraum Halbjahr und die Einheit „pro Halbjahr“. Bestehende Installationen bekommen sie beim Update einmal nachgetragen, sofern noch keine Einheit das Halbjahr meint.
  • list-units nennt je Einheit auch die Zahl der Attributwerte (terms), get-product-units bei jeder Zeile die Herkunft der Einheit (source: attribute oder product).

Geändert

  • Ein Produkt mit Varianten darf ein Abo sein, wenn jede Variante über ihren Attributwert eine Einheit mit Zeitraum mitbringt, auch ohne Einheit am Eltern-Produkt. Das gilt beim Speichern im Backend, im Hinweis des Reiters „Abo & Einheit“ und in set-product-units.
  • Die Mindestlaufzeit zählt in der Einheit der gekauften Variante: 1 heißt 1 Monat, 1 Halbjahr oder 1 Jahr.
  • Eine Einheit an einem Attributwert zählt als benutzt: Sie lässt sich nicht löschen, und die Einheiten-Seite zeigt sie unter „Verwendung“ an. Die Deinstallation im Backend räumt die Einheiten an Attributwerten mit ab.
  • Der Vertragshinweis unter dem Preis lässt die Mindestlaufzeit weg, wenn erst die Varianten den Zeitraum mitbringen, statt „Mindestlaufzeit 1“ ohne Zeitraum zu zeigen.
  • Hilfe-Seite und README erklären den Weg über den Attributwert.

v0.7.1

Behoben

  • Hilfe-Seite aufgeräumt (#9): Abschnitt 1 beschrieb noch die Freitext-Einheit „Eigene Einheit“, die es seit v0.3.0 nicht mehr gibt. Jetzt steht dort, dass Einheiten zentral im Reiter „Einheiten“ angelegt und am Produkt nur gewählt werden, mit Link auf den Reiter.
  • Abschnitt 2 nennt, wo Laufzeit und Frist erscheinen (Warenkorb, Kasse, Bestellung, E-Mails), und empfiehlt für die Produktseite Produkt-Attribute, die jedes Theme anzeigt, auch Layouts aus einem Seitenbaukasten.

v0.7.0

Hinzugefügt

  • Neuer Reiter DSGVO, Pflichtseite nach IDF-Plugin-Konvention (#5). Er zeigt, welche personenbezogenen Daten das Plugin wo speichert (Vertragsdaten, Zeitpunkt und Grund der Kündigung in woocommerce_order_itemmeta, Statusnotizen in comments, dazu die drei Kündigungs-Mails), dass das Plugin selbst nichts an Dritte überträgt, einen kopierbaren Textvorschlag für die Datenschutzerklärung und fünf Punkte, die der Betreiber selbst festlegen muss: Speicherdauer, Auskunft und Löschung, Abrechnung, E-Mail-Versand, öffentlich Erreichbares.
  • Die Seite steht zwischen Einstellungen und Hilfe und verlangt manage_options; ein Shop-Manager sieht den Reiter nicht.

v0.6.0

Hinzugefügt

  • Vier Abilities für MCP und REST: list-units liefert die Einheiten mit Zeitraum und Nutzung, ensure-units legt fehlende Einheiten zu Bezeichnungen an, get-product-units liest die Einheit von bis zu 100 Produkten, set-product-units setzt sie. (#8)
  • Beim Setzen per Ability behält ein Abo-Produkt sein Abo: eine Einheit ohne Zeitraum wird dort abgewiesen, statt das Abo still abzuschalten.
  • ensure-units erkennt eine vorhandene Einheit ohne Rücksicht auf Groß- und Kleinschreibung, aus "Pro Fenster" wird keine zweite Einheit neben "pro Fenster".

v0.5.0

Geändert

  • Menü nach IDF-Konvention: ein Eintrag unter IDF Home ("Woo Subscriptions"), die Seiten Einheiten, Einstellungen, Hilfe und Deinstallation sind Reiter statt Menüpunkte. Ohne IDF Home wie bisher ein eigener Top-Level-Punkt. Alle bisherigen URLs bleiben gültig. (#7)
  • Eine seiten()-Methode ist jetzt die einzige Quelle für Slug, Titel und Berechtigung der Admin-Seiten; die Reiterleiste macht dieselbe Berechtigungsprüfung wie die Seiten selbst.

v0.4.1

Behoben

  • Bei variablen Produkten stand die Einheit im Varianten-Preis links vom Betrag ("pro Tag 2.490,00 €"). Ursache war das Theme: Avada rendert den Varianten-Preis als Flex-Container mit umgekehrter Richtung, wodurch das Suffix mit nach vorn kippte. Die Reihenfolge wird jetzt zurückgedreht, wo die Einheit steht.
  • Die Einheit wird nicht mehr in Großbuchstaben gesetzt, wenn das Theme den Preis-Block auf Versalien stellt ("PRO TAG").

v0.4.0

Hinzugefügt

  • Die Kündigungsfrist lässt sich in Tagen, Wochen oder Monaten angeben, nicht mehr nur in Tagen.
  • Einheiten tragen jetzt einen Zeitraum (Tag, Woche, Monat, Quartal, Jahr) statt eines Ja/Nein-Hakens.

Behoben

  • Bei selbst angelegten Zeit-Einheiten scheiterte die Berechnung der Mindestlaufzeit stillschweigend: Das Plugin hat den Zeitraum aus dem Schlüssel geraten, der bei eigenen Einheiten nicht passt. Jetzt sagt die Einheit selbst, welche Spanne sie meint.

v0.3.0

Hinzugefügt

  • Zentrale Einheiten-Verwaltung unter "Woo Subscriptions > Einheiten": Einheiten anlegen, umbenennen und löschen. Am Produkt wird nur noch ausgewählt.
  • Erste Schritte auf der Übersichtsseite, solange noch kein Abo verkauft wurde.

Geändert

  • Die Preis-Einheit wird am Produkt aus der verwalteten Liste gewählt. Das Freitext-Feld entfällt.
  • Umbenennen einer Einheit wirkt sofort auf alle Produkte; bereits verkaufte Verträge behalten ihre Bezeichnung zum Kaufzeitpunkt.
  • Eine Einheit, die an Produkten hängt, lässt sich nicht mehr löschen.

Behoben

  • Bestehende Produkte mit Freitext-Einheit werden beim Update automatisch in die Verwaltung überführt; gleiche Schreibweisen werden dabei zusammengeführt.

v0.2.0

Hinzugefügt

  • Admin-Menü mit Übersicht, Einstellungen, Hilfe und Deinstallation. Die Übersicht listet alle Abos und hebt offene Kündigungen hervor.
  • Einstellung für die Priorität des Einheiten-Suffix, damit es sich gegen andere Plugins am Preis positionieren lässt (etwa German Market).
  • Einstellung, ob die Einheit im Warenkorb erscheint, plus Feld für eigenes CSS.

Behoben

  • Umlaute in Plugin-Header, Oberfläche und Code-Kommentaren.
  • Settings-Button im IDF-Home-Dashboard fehlte. Er erscheint nur, wenn ein Menüpunkt mit dem Plugin-Slug existiert.

v0.1.0

Hinzugefügt

  • Preis-Einheit je Produkt (pro Monat, Quartal, Jahr, Woche, Tag, Stunde, Freitext), angezeigt in Shop, Warenkorb, Bestellung und E-Mails.
  • Abo-Produkte mit Mindestlaufzeit und Kündigungsfrist.
  • Abo-Status an der Bestellposition, HPOS-sicher über die CRUD-API.
  • Kündigung im Kundenkonto, Statuspflege in der Bestellung.
  • Drei WooCommerce-Mails für den Kündigungsablauf.
Info
  • Version: 0.14.0
  • Version vom: 27. September 2026
  • WordPress-Version: 6.0
  • Getestet bis WP-Version: 6.8
  • PHP-Version: 8.0
  • Kompatible Themes: Alle
  • Erforderliche Plugins: WooCommerce
  • Mitwirkende: Joerg Martin