@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=154104>
  a sioc:Post ;
  dc:title "LH Phone Numbers" ;
  dcterms:identifier 154104 ;
  dc:modified "2026-11-09T13:27:59Z"^^xsd:dateTime ;
  dc:created "2026-11-09T13:27:59Z"^^xsd:dateTime ;
  sioc:link <https://lhero.org/portfolio/lh-phone-numbers/> ;
  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 Phone Numbers keeps every phone number on a WordPress network in one place. Each number is stored once, in international E.164 form, and linked to the people who use it. A person can have as many numbers as they need, one of which is their primary, and a shared number such as a family landline is stored once and linked to everyone who uses it.</p>



<p class="wp-block-paragraph">Facts about a number belong to the number. If someone texts STOP, that opt-out holds for everyone sharing the number, so nobody on it is texted again by mistake. Facts about one person&#8217;s use of a number, such as whether it is their home or work number, whether it is their primary and whether they have verified it, belong to the link between them.</p>



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



<ul class="wp-block-list">
<li>Numbers in any common format are checked and stored as E.164 using Google&#8217;s libphonenumber, with numbers that have no country code read as Australian by default (filterable).</li>



<li>Each number&#8217;s line type (mobile, landline, VoIP and so on) is detected when it is first stored.</li>



<li>Channels per number (SMS, WhatsApp, iMessage, Signal), each with its own opt-out and last delivery times. Mobile numbers get SMS automatically.</li>



<li>Links carry a context (home, work or other), a primary flag, a verified time and where the link came from.</li>



<li>Owners are polymorphic (an object type plus an ID). Only users are enabled for now; other types can be added with a filter.</li>



<li>A PHP API for other plugins to look numbers up, link them and record channel results, plus read-only MCP abilities.</li>
</ul>



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



<p class="wp-block-paragraph">Network-activate the plugin. Its tables are created on activation, network-wide. It needs WordPress 6.9 and PHP 8.1, and its bundled Composer dependencies installed in vendor/.</p>



<p class="wp-block-paragraph">When LH Profile Page is active, its primary and secondary phone fields are copied in automatically, both for existing users (in the background, in batches) and whenever either field changes.</p>



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


"""^^rdf:XMLLiteral ;
  sioc:content """Type: PluginLifecycle Stage: Experimental
LH Phone Numbers keeps every phone number on a WordPress network in one place. Each number is stored once, in international E.164 form, and linked to the people who use it. A person can have as many numbers as they need, one of which is their primary, and a shared number such as a family landline is stored once and linked to everyone who uses it.



Facts about a number belong to the number. If someone texts STOP, that opt-out holds for everyone sharing the number, so nobody on it is texted again by mistake. Facts about one person&#8217;s use of a number, such as whether it is their home or work number, whether it is their primary and whether they have verified it, belong to the link between them.



Features




Numbers in any common format are checked and stored as E.164 using Google&#8217;s libphonenumber, with numbers that have no country code read as Australian by default (filterable).



Each number&#8217;s line type (mobile, landline, VoIP and so on) is detected when it is first stored.



Channels per number (SMS, WhatsApp, iMessage, Signal), each with its own opt-out and last delivery times. Mobile numbers get SMS automatically.



Links carry a context (home, work or other), a primary flag, a verified time and where the link came from.



Owners are polymorphic (an object type plus an ID). Only users are enabled for now; other types can be added with a filter.



A PHP API for other plugins to look numbers up, link them and record channel results, plus read-only MCP abilities.




Setup



Network-activate the plugin. Its tables are created on activation, network-wide. It needs WordPress 6.9 and PHP 8.1, and its bundled Composer dependencies installed in vendor/.



When LH Profile Page is active, its primary and secondary phone fields are copied in automatically, both for existing users (in the background, in batches) and whenever either field changes.



Documentation


""" ;
  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=contacts>, <https://lhero.org/?taxonomy=lh_portfolio-tags&term=sms>, <https://lhero.org/?taxonomy=lh_portfolio-tags&term=phone-numbers>, <https://lhero.org/?taxonomy=lh_portfolio-tags&term=user-profile>, <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=contacts> rdfs:seeAlso <https://lhero.org/?taxonomy=lh_portfolio-tags&term=contacts&feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=lh_portfolio-tags&term=sms> rdfs:seeAlso <https://lhero.org/?taxonomy=lh_portfolio-tags&term=sms&feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=lh_portfolio-tags&term=phone-numbers> rdfs:seeAlso <https://lhero.org/?taxonomy=lh_portfolio-tags&term=phone-numbers&feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=lh_portfolio-tags&term=user-profile> rdfs:seeAlso <https://lhero.org/?taxonomy=lh_portfolio-tags&term=user-profile&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> .
