@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-doc&#038;p=147607>
  a sioc:Post ;
  dc:title "Architecture" ;
  dcterms:identifier 147607 ;
  dc:modified "2026-09-16T18:40:36Z"^^xsd:dateTime ;
  dc:created "2026-09-16T16:34:14Z"^^xsd:dateTime ;
  sioc:link <https://lhero.org/portfolio/lh-user-profiles/architecture/> ;
  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>Part of:</strong> <a href="https://lhero.org/portfolio/lh-user-profiles/">LH User Profiles</a></li></ul>
<p class="wp-block-paragraph">A singleton plugin class (<code>LH_User_Profiles_Plugin</code>) that bootstraps on <code>plugins_loaded</code>, behind the <code>lh_user_profiles_init_plugin</code> filter. It has no admin screens, database tables, cron jobs, settings or MCP abilities. On <code>init</code> it registers the avatar shortcode and the block (from <code>blocks/profiles/block.json</code>); on <code>rest_api_init</code> it registers the editor search route.</p>



<p class="wp-block-paragraph">The block renders through one static method, <code>render_profiles( $user_ids, $fields )</code>, called directly with the block&#8217;s <code>userIds</code> and <code>fields</code> attributes. The block&#8217;s editor script uses plain <code>wp.*</code> globals with no build step, and previews through <code>ServerSideRender</code>.</p>



<h2 class="wp-block-heading">Data it reads</h2>



<p class="wp-block-paragraph">The plugin stores no content of its own. It reads core user fields (<code>display_name</code>, <code>description</code>, avatar) plus two user meta keys written by other LocalHero plugins: <code>lh_users_secondary_email</code> and <code>lh_profile-phone</code> (E.164). A site leaving LocalHero keeps that data in its own user tables, but existing pages depend on this plugin to render it, which is why the plugin is public.</p>



<p class="wp-block-paragraph">The only option it writes is <code>lh_user_profiles_version</code> (per site, not autoloaded). When upgrading from a version before 1.1.0, the plugin deletes the site&#8217;s cached <code>rewrite_rules</code> once so WordPress regenerates them.</p>



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



<ul class="wp-block-list">
<li><strong>Profile post type, removed in 1.1.0.</strong> 1.00 registered an unused public post type, <code>lh_user_profiles_pt</code>, which claimed the <code>profile</code> rewrite slug and <code>profiles</code> archive on every site and risked clashing with other profile routes. It is intended to return later, properly designed, for richer profiles of members who are also authors (lh-tasks #147603).</li>



<li><strong>Listing shortcode, removed in 1.2.0.</strong> Replaced by the User Profiles block once all content on the network had been migrated (lh-tasks #147604).</li>
</ul>



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



<ul class="wp-block-list">
<li><code>lh_user_profiles_init_plugin</code> (filter, default <code>true</code>): return false to stop the plugin loading.</li>



<li><code>lh_user_profiles_return_editor_capability</code> (filter, default <code>edit_others_posts</code>): capability needed to use the editor search route.</li>



<li><code>lh_user_profiles_format_phone</code> (filter, args: formatted string, digits): change how mobile numbers are displayed.</li>



<li><code>get_the_author_description</code> (core filter): applied to each person&#8217;s bio, via <code>get_the_author_meta()</code>.</li>
</ul>



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



<p class="wp-block-paragraph">The avatar shortcode stays. The profile post type will be reintroduced as a separate piece of work (lh-tasks #147603).</p>
"""^^rdf:XMLLiteral ;
  sioc:content """Part of: LH User Profiles
A singleton plugin class (LH_User_Profiles_Plugin) that bootstraps on plugins_loaded, behind the lh_user_profiles_init_plugin filter. It has no admin screens, database tables, cron jobs, settings or MCP abilities. On init it registers the avatar shortcode and the block (from blocks/profiles/block.json); on rest_api_init it registers the editor search route.



The block renders through one static method, render_profiles( $user_ids, $fields ), called directly with the block&#8217;s userIds and fields attributes. The block&#8217;s editor script uses plain wp.* globals with no build step, and previews through ServerSideRender.



Data it reads



The plugin stores no content of its own. It reads core user fields (display_name, description, avatar) plus two user meta keys written by other LocalHero plugins: lh_users_secondary_email and lh_profile-phone (E.164). A site leaving LocalHero keeps that data in its own user tables, but existing pages depend on this plugin to render it, which is why the plugin is public.



The only option it writes is lh_user_profiles_version (per site, not autoloaded). When upgrading from a version before 1.1.0, the plugin deletes the site&#8217;s cached rewrite_rules once so WordPress regenerates them.



History




Profile post type, removed in 1.1.0. 1.00 registered an unused public post type, lh_user_profiles_pt, which claimed the profile rewrite slug and profiles archive on every site and risked clashing with other profile routes. It is intended to return later, properly designed, for richer profiles of members who are also authors (lh-tasks #147603).



Listing shortcode, removed in 1.2.0. Replaced by the User Profiles block once all content on the network had been migrated (lh-tasks #147604).




Hooks




lh_user_profiles_init_plugin (filter, default true): return false to stop the plugin loading.



lh_user_profiles_return_editor_capability (filter, default edit_others_posts): capability needed to use the editor search route.



lh_user_profiles_format_phone (filter, args: formatted string, digits): change how mobile numbers are displayed.



get_the_author_description (core filter): applied to each person&#8217;s bio, via get_the_author_meta().




Roadmap



The avatar shortcode stays. The profile post type will be reintroduced as a separate piece of work (lh-tasks #147603).
""" ;
  sioc:topic <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/?taxonomy=author&term=cap-1> rdfs:seeAlso <https://lhero.org/?taxonomy=author&term=cap-1&feed=lhrdf&format=turtle> .
