@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=147169>
  a sioc:Post ;
  dc:title "Hooks Reference" ;
  dcterms:identifier 147169 ;
  dc:modified "2026-09-11T16:41:47Z"^^xsd:dateTime ;
  dc:created "2026-09-09T01:46:13Z"^^xsd:dateTime ;
  sioc:link <https://lhero.org/portfolio/lh-profile-page/hooks-reference/> ;
  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> Doc-section</li><li><strong>Part of:</strong> <a href=\"https://lhero.org/portfolio/lh-profile-page/\">LH Profile Page</a></li></ul><h1 class=\"wp-block-heading\">Hooks Reference</h1><p class=\"wp-block-paragraph\">All registered in <code>plugin_init()</code> unless noted. This plugin integrates with a large number of other <code>lh-</code> plugins &#8211; grouped by what they connect to.</p><h2 class=\"wp-block-heading\">Registered meta (see Database Schema for details)</h2><p class=\"wp-block-paragraph\"><code>register_meta()</code> is called on <code>init</code> for phone, gender, birthdate, and all five address fields, each via its own field class&#039;s <code>register_meta_fields()</code>.</p><h2 class=\"wp-block-heading\">User edit / save lifecycle</h2><ul class=\"wp-block-list\"><li><code>show_user_profile</code> / <code>edit_user_profile</code> -&gt; <code>add_backend_profile_fields()</code></li><li><code>personal_options_update</code> / <code>edit_user_profile_update</code> / <code>user_register</code> -&gt; <code>save_backend_profile_profile_fields()</code></li><li><code>wp</code> -&gt; <code>save_data()</code> -&gt; <code>post_handler()</code> (frontend form POST handling)</li><li><code>updated_user_meta</code> / <code>added_user_meta</code> -&gt; <code>track_last_meta_update_time()</code></li><li><code>add_user_metadata</code> -&gt; <code>prevent_bad_meta_values()</code> (rejects empty writes to non-native fields)</li></ul><h2 class=\"wp-block-heading\">BuddyPress</h2><ul class=\"wp-block-list\"><li><code>bp_xprofile_get_field_types</code> -&gt; <code>add_field_types()</code></li><li><code>xprofile_get_field_data</code> / <code>bp_get_the_profile_field_value</code> -&gt; override to read real user meta instead of <code>bp_xprofile_data</code></li><li><code>bp_after_has_profile_parse_args</code> -&gt; <code>intercept_profile_query_args()</code> (excludes the native Name field from the xprofile loop)</li><li><code>get_avatar</code> / <code>bp_core_fetch_avatar</code> / <code>bp_core_fetch_avatar_url</code> -&gt; gender-based fallback avatar images</li><li><code>bp_xprofile_new_avatar_action</code> -&gt; gendered pronoun text (&quot;changed his/her profile picture&quot;)</li></ul><h2 class=\"wp-block-heading\">&quot;Users Insights&quot; plugin integration</h2><ul class=\"wp-block-list\"><li><code>usin_fields</code> / <code>usin_db_map</code> / <code>usin_query_join_table</code> &#8211; both this class&#039;s own <code>register_fields()</code>/<code>filter_db_map()</code>/<code>filter_query_joins()</code> (address group) and <code>LH_Profile_Phone_Field</code>&#039;s equivalents (phone group) are hooked separately, since they can&#039;t be merged into one callback (see Field Class Architecture).</li></ul><h2 class=\"wp-block-heading\">LH Check-Ins / Log Entry integration</h2><ul class=\"wp-block-list\"><li><code>lh_bp_check_ins_check_if_can_check_in</code> / <code>lh_bp_log_entry_check_if_can_check_in</code> -&gt; <code>force_to_unknown()</code> (routes to the &quot;unknown user&quot; flow if gender/phone/birthdate are missing)</li><li><code>lh_bp_check_ins_form_unknown</code> / <code>lh_bp_log_entry_form_unknown</code> -&gt; <code>add_fields_to_form_unknown()</code></li><li><code>lh_bp_check_ins_activity_added</code> / <code>lh_bp_log_entry_activity_added</code> / <code>*_user_recognised</code> -&gt; <code>maybe_add_user_data_on_activity_add()</code> / <code>maybe_add_user_data_on_user_recognised()</code> -&gt; <code>maybe_do_user_update()</code></li><li><code>{namespace}_user_table_header_after</code> / <code>*_row_after</code> (conditional on <code>LH_Buddypress_check_ins_plugin</code> existing) -&gt; adds mobile/gender columns to check-in reports</li></ul><h2 class=\"wp-block-heading\">LH CRM / Group Invites</h2><ul class=\"wp-block-list\"><li><code>lh_crm_http_post_after_user</code> / <code>lh_bgr_http_post_after_user</code> -&gt; <code>new_user_update()</code> (a near-duplicate of <code>post_handler()</code>/<code>maybe_do_user_update()</code> &#8211; see Field Class Architecture&#039;s note on unconsolidated orchestrator methods)</li><li><code>lh_crm_send_notification_tokens</code> -&gt; <code>add_notification_tokens()</code></li></ul><h2 class=\"wp-block-heading\">CSV import</h2><ul class=\"wp-block-list\"><li><code>lh_iubc_result_handle_new_user_success</code> / <code>lh_iubc_result_exists</code> -&gt; <code>maybe_add_details_when_csv_is_uploaded()</code></li></ul><h2 class=\"wp-block-heading\">LH Buddypress Group Reports</h2><ul class=\"wp-block-list\"><li><code>lh_bg_reports_fields</code> -&gt; <code>add_new_report_fields()</code></li><li><code>lh_bg_reports_field_output</code> -&gt; <code>format_report_fields()</code> (formats birthdate as <code>d-m-Y</code> and phone as clickable tel/sms links)</li></ul><h2 class=\"wp-block-heading\">LH Vcard</h2><ul class=\"wp-block-list\"><li><code>lh_vcard_add_data</code> -&gt; <code>add_vcard_data()</code></li><li><code>lh_vcard_return_all_tracked_meta_fields</code> -&gt; <code>add_vcard_tracking()</code></li></ul><h2 class=\"wp-block-heading\">LH Add User</h2><ul class=\"wp-block-list\"><li><code>lh_add_user_page_after_email</code> -&gt; <code>add_additional_inputs()</code> (adds phone + gender fields to the add-user flow)</li><li><code>lh_add_user_page_after_user_insertion</code> -&gt; <code>maybe_add_values_to_user()</code></li></ul><h2 class=\"wp-block-heading\">Search &amp; user list</h2><ul class=\"wp-block-list\"><li><code>pre_user_query</code> -&gt; <code>extend_user_search()</code> (adds phone/emails to admin user search)</li><li><code>pre_get_users</code> -&gt; <code>modify_user_list()</code> (filter users list by gender query param)</li><li><code>manage_users_columns</code> / <code>manage_users_custom_column</code> / <code>default_hidden_columns</code> -&gt; gender/emails admin columns</li></ul><h2 class=\"wp-block-heading\">Filters this plugin exposes for other plugins to hook</h2><ul class=\"wp-block-list\"><li><code>lh_profile_return_plugin_debugging_status</code> &#8211; gate for <code>write_log()</code> output (defaults <code>true</code>)</li><li><code>lh_profile_birthdate_minimum_age_years</code> &#8211; added v2.14, lets another plugin (intended: LH Membership) restrict the birthdate input&#039;s client-side <code>max</code> date to enforce a minimum age. Defaults <code>0</code> (no restriction). See Architectural Notes.</li><li><code>lh_profle_return_required_fields</code> / <code>lh_profle_has_required_fields</code> &#8211; customise which fields count as &quot;required&quot; for <code>has_required_fields()</code></li></ul>"^^rdf:XMLLiteral ;
  sioc:content "Type: Doc-sectionPart of: LH Profile PageHooks ReferenceAll registered in plugin_init() unless noted. This plugin integrates with a large number of other lh- plugins &#8211; grouped by what they connect to.Registered meta (see Database Schema for details)register_meta() is called on init for phone, gender, birthdate, and all five address fields, each via its own field class&#039;s register_meta_fields().User edit / save lifecycleshow_user_profile / edit_user_profile -&gt; add_backend_profile_fields()personal_options_update / edit_user_profile_update / user_register -&gt; save_backend_profile_profile_fields()wp -&gt; save_data() -&gt; post_handler() (frontend form POST handling)updated_user_meta / added_user_meta -&gt; track_last_meta_update_time()add_user_metadata -&gt; prevent_bad_meta_values() (rejects empty writes to non-native fields)BuddyPressbp_xprofile_get_field_types -&gt; add_field_types()xprofile_get_field_data / bp_get_the_profile_field_value -&gt; override to read real user meta instead of bp_xprofile_databp_after_has_profile_parse_args -&gt; intercept_profile_query_args() (excludes the native Name field from the xprofile loop)get_avatar / bp_core_fetch_avatar / bp_core_fetch_avatar_url -&gt; gender-based fallback avatar imagesbp_xprofile_new_avatar_action -&gt; gendered pronoun text (&quot;changed his/her profile picture&quot;)&quot;Users Insights&quot; plugin integrationusin_fields / usin_db_map / usin_query_join_table &#8211; both this class&#039;s own register_fields()/filter_db_map()/filter_query_joins() (address group) and LH_Profile_Phone_Field&#039;s equivalents (phone group) are hooked separately, since they can&#039;t be merged into one callback (see Field Class Architecture).LH Check-Ins / Log Entry integrationlh_bp_check_ins_check_if_can_check_in / lh_bp_log_entry_check_if_can_check_in -&gt; force_to_unknown() (routes to the &quot;unknown user&quot; flow if gender/phone/birthdate are missing)lh_bp_check_ins_form_unknown / lh_bp_log_entry_form_unknown -&gt; add_fields_to_form_unknown()lh_bp_check_ins_activity_added / lh_bp_log_entry_activity_added / *_user_recognised -&gt; maybe_add_user_data_on_activity_add() / maybe_add_user_data_on_user_recognised() -&gt; maybe_do_user_update(){namespace}_user_table_header_after / *_row_after (conditional on LH_Buddypress_check_ins_plugin existing) -&gt; adds mobile/gender columns to check-in reportsLH CRM / Group Inviteslh_crm_http_post_after_user / lh_bgr_http_post_after_user -&gt; new_user_update() (a near-duplicate of post_handler()/maybe_do_user_update() &#8211; see Field Class Architecture&#039;s note on unconsolidated orchestrator methods)lh_crm_send_notification_tokens -&gt; add_notification_tokens()CSV importlh_iubc_result_handle_new_user_success / lh_iubc_result_exists -&gt; maybe_add_details_when_csv_is_uploaded()LH Buddypress Group Reportslh_bg_reports_fields -&gt; add_new_report_fields()lh_bg_reports_field_output -&gt; format_report_fields() (formats birthdate as d-m-Y and phone as clickable tel/sms links)LH Vcardlh_vcard_add_data -&gt; add_vcard_data()lh_vcard_return_all_tracked_meta_fields -&gt; add_vcard_tracking()LH Add Userlh_add_user_page_after_email -&gt; add_additional_inputs() (adds phone + gender fields to the add-user flow)lh_add_user_page_after_user_insertion -&gt; maybe_add_values_to_user()Search &amp; user listpre_user_query -&gt; extend_user_search() (adds phone/emails to admin user search)pre_get_users -&gt; modify_user_list() (filter users list by gender query param)manage_users_columns / manage_users_custom_column / default_hidden_columns -&gt; gender/emails admin columnsFilters this plugin exposes for other plugins to hooklh_profile_return_plugin_debugging_status &#8211; gate for write_log() output (defaults true)lh_profile_birthdate_minimum_age_years &#8211; added v2.14, lets another plugin (intended: LH Membership) restrict the birthdate input&#039;s client-side max date to enforce a minimum age. Defaults 0 (no restriction). See Architectural Notes.lh_profle_return_required_fields / lh_profle_has_required_fields &#8211; customise which fields count as &quot;required&quot; for has_required_fields()" ;
  sioc:topic <https://lhero.org/lh_portfolio-type/doc-section/>, <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/doc-section/> rdfs:seeAlso <https://lhero.org/lh_portfolio-type/doc-section/?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> .
