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

<https://lhero.org/?post_type=lh-portfolio&#038;p=150015>
  a sioc:Post ;
  dc:title "LH Addresses" ;
  dcterms:identifier 150015 ;
  dc:modified "2026-10-12T03:14:56Z"^^xsd:dateTime ;
  dc:created "2026-10-12T03:14:56Z"^^xsd:dateTime ;
  sioc:link <https://lhero.org/portfolio/lh-addresses/> ;
  sioc:has_creator <https://lhero.org/author/1/#account> ;
  sioc:has_container <https://lhero.org/#posts> ;
  content:encoded """<ul class="lh_portfolio-meta"><li><strong>Type:</strong> Plugin</li><li><strong>Lifecycle Stage:</strong> Experimental</li></ul>
<p class="wp-block-paragraph">LH Addresses stores postal addresses for users as structured, international data, once for the whole network, and shares them with the organisations those users belong to. On a multisite network each site is an organisation; a member&#8217;s address is theirs, and an organisation sees only the addresses that member has given it.</p>



<h2 class="wp-block-heading">Why</h2>



<p class="wp-block-paragraph">Addresses kept as loose user meta fields have no shape: no country awareness, states typed as Vic, VIC or Victoria, one address per person, and every consumer (vCards, reports, exports) mapping fields by hand. LH Addresses gives each address a standard structure that converts cleanly to vCard ADR and schema.org PostalAddress, so the data stays portable.</p>



<h2 class="wp-block-heading">Features</h2>



<ul class="wp-block-list">
<li>Address fields follow the Unicode CLDR model used by commerceguys/addressing, with per-country validation and subdivision codes (Victoria and Vic become VIC).</li>



<li>Several addresses per user, each used as one or more types: residential, postal, delivery, billing or work.</li>



<li>Per-organisation uses: a member gives an address to a site as a type, and that site sees it while they remain a member. Leaving removes the site&#8217;s access.</li>



<li>Validation never refuses a save: incomplete or invalid addresses are flagged for later clean-up, so imports always land.</li>



<li>Optional geocoding through a pluggable geocoder (LH Places), queued and throttled, with a spatial index for near-point searches.</li>



<li>WordPress personal data export and erasure, and cascade deletion when a user is deleted.</li>
</ul>



<h2 class="wp-block-heading">Setup</h2>



<p class="wp-block-paragraph">Network-activate the plugin and run <code>composer install</code> in its folder to fetch commerceguys/addressing; without it, addresses are stored but not validated or mapped. Organisation access needs a plugin that answers the <code>lh_addresses_site_can_read</code> filter (LH Membership), and geocoding needs one that answers <code>lh_places_geocode</code> (LH Places). LH Addresses has no admin screens of its own: other plugins use its API.</p>


<ul class="lh_portfolio-doc-toc"><li><a href="https://lhero.org/portfolio/lh-addresses/changelog/">Changelog</a></li><li><a href="https://lhero.org/portfolio/lh-addresses/data-model-and-access/">Data model and access</a></li><li><a href="https://lhero.org/portfolio/lh-addresses/database-tables/">Database tables</a></li><li><a href="https://lhero.org/portfolio/lh-addresses/hooks-filters-and-cron/">Hooks, filters and cron</a></li><li><a href="https://lhero.org/portfolio/lh-addresses/notes/">Notes</a></li></ul>"""^^rdf:XMLLiteral ;
  sioc:content """Type: PluginLifecycle Stage: Experimental
LH Addresses stores postal addresses for users as structured, international data, once for the whole network, and shares them with the organisations those users belong to. On a multisite network each site is an organisation; a member&#8217;s address is theirs, and an organisation sees only the addresses that member has given it.



Why



Addresses kept as loose user meta fields have no shape: no country awareness, states typed as Vic, VIC or Victoria, one address per person, and every consumer (vCards, reports, exports) mapping fields by hand. LH Addresses gives each address a standard structure that converts cleanly to vCard ADR and schema.org PostalAddress, so the data stays portable.



Features




Address fields follow the Unicode CLDR model used by commerceguys/addressing, with per-country validation and subdivision codes (Victoria and Vic become VIC).



Several addresses per user, each used as one or more types: residential, postal, delivery, billing or work.



Per-organisation uses: a member gives an address to a site as a type, and that site sees it while they remain a member. Leaving removes the site&#8217;s access.



Validation never refuses a save: incomplete or invalid addresses are flagged for later clean-up, so imports always land.



Optional geocoding through a pluggable geocoder (LH Places), queued and throttled, with a spatial index for near-point searches.



WordPress personal data export and erasure, and cascade deletion when a user is deleted.




Setup



Network-activate the plugin and run composer install in its folder to fetch commerceguys/addressing; without it, addresses are stored but not validated or mapped. Organisation access needs a plugin that answers the lh_addresses_site_can_read filter (LH Membership), and geocoding needs one that answers lh_places_geocode (LH Places). LH Addresses has no admin screens of its own: other plugins use its API.


ChangelogData model and accessDatabase tablesHooks, filters and cronNotes""" ;
  sioc:topic <https://lhero.org/lh_portfolio-type/plugin/>, <https://lhero.org/lh_portfolio-lifecycle-stage/experimental/>, <https://lhero.org/?taxonomy=lh_portfolio-tags&term=multisite>, <https://lhero.org/?taxonomy=lh_portfolio-tags&term=privacy>, <https://lhero.org/?taxonomy=lh_portfolio-tags&term=membership>, <https://lhero.org/?taxonomy=lh_portfolio-tags&term=addresses>, <https://lhero.org/?taxonomy=lh_portfolio-tags&term=geocoding>, <https://lhero.org/?taxonomy=author&term=cap-1> .

<https://lhero.org/author/1/#account> rdfs:seeAlso <https://lhero.org/author/1/?feed=lhrdf&format=turtle> .
<https://lhero.org/lh_portfolio-type/plugin/> rdfs:seeAlso <https://lhero.org/lh_portfolio-type/plugin/?feed=lhrdf&format=turtle> .
<https://lhero.org/lh_portfolio-lifecycle-stage/experimental/> rdfs:seeAlso <https://lhero.org/lh_portfolio-lifecycle-stage/experimental/?feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=lh_portfolio-tags&term=multisite> rdfs:seeAlso <https://lhero.org/?taxonomy=lh_portfolio-tags&term=multisite&feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=lh_portfolio-tags&term=privacy> rdfs:seeAlso <https://lhero.org/?taxonomy=lh_portfolio-tags&term=privacy&feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=lh_portfolio-tags&term=membership> rdfs:seeAlso <https://lhero.org/?taxonomy=lh_portfolio-tags&term=membership&feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=lh_portfolio-tags&term=addresses> rdfs:seeAlso <https://lhero.org/?taxonomy=lh_portfolio-tags&term=addresses&feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=lh_portfolio-tags&term=geocoding> rdfs:seeAlso <https://lhero.org/?taxonomy=lh_portfolio-tags&term=geocoding&feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=author&term=cap-1> rdfs:seeAlso <https://lhero.org/?taxonomy=author&term=cap-1&feed=lhrdf&format=turtle> .
