Hooks
Hooks allow you to modify and extend the functionality of JReviews without having to modify existing code.
Below you can find a growing list of existing action and filter hooks. Before you get started with hooks, make sure to read the developers documentation, and specifically the section on using hooks.
Admin Sidebar
Asset Manager
-
jreviews:admin_route_matched:{:name}Route-specific action that fires when a JReviews admin route is matched. The route name has dots converted to underscores (e.g., 'listings.index' becomes 'listings_index'). Useful for conditionally loading admin assets or performing actions based on the current admin route.
-
jreviews:route_matched:{:name}Route-specific action that fires when a JReviews frontend route is matched. The route name has dots converted to underscores (e.g., 'listing.detail' becomes 'listing_detail'). Useful for conditionally loading assets or performing actions based on the current route.
Claims
-
jreviews:permission:listing.claimFilters whether a user has permission to claim a listing.code examples
-
jreviews:listing_claim_form.validationFires during listing claim form validation. Use `$validator->after()` callback to add custom validation rules to the claim submission.
-
jreviews:listing_claim_form.bottomFires at the bottom of the listing claim modal form. Use for adding custom fields or content. Output is captured via output buffering.
Comment Discussion Permissions
-
jreviews:permission:comment_discussion.createFilters whether a user has permission to create a new discussion post on a review.
-
jreviews:permission:comment_discussion.updateFilters whether a user has permission to update/edit a discussion post.
-
jreviews:permission:comment_discussion.allows_html_in_comment_discussionFilters whether HTML content is allowed in review discussion posts.
-
jreviews:permission:comment_discussion.autopublishFilters whether a user's discussion posts should be automatically published without moderation.code examples
-
jreviews:permission:comment_discussion.deleteFilters whether a user has permission to delete a discussion post.
-
jreviews:permission:comment_discussion.reportFilters whether a user has permission to report a discussion post as inappropriate.
Comment Discussions
-
jreviews:comment_discussion_form.validationAllows adding custom validation rules to the comment discussion submission form validator.code examples
-
jreviews:comment_discussion_form.bottomAllows injecting custom HTML/content at the bottom of the comment discussion form, immediately before the submit button. Used by captcha and privacy checkbox hooks.
Comment Permissions
-
jreviews:permission:comment.createFilters whether a user has permission to create a comment (either user comment or editorial comment).
-
jreviews:permission:comment.create_user_commentFilters whether a user has permission to submit a user review/comment.
-
jreviews:permission:comment.create_editorial_commentFilters whether a user has permission to submit an editorial/editor review.
-
jreviews:permission:comment.update_user_commentFilters whether a user has permission to update a user comment specifically.
-
jreviews:permission:comment.update_editorial_commentFilters whether a user has permission to update an editorial comment specifically.
-
jreviews:permission:comment.updateFilters whether a user has permission to update a comment (user or editorial).
-
jreviews:permission:comment.voteFilters whether a user has permission to vote (helpful/not helpful) on a comment.
-
jreviews:permission:comment.see_vote_widgetFilters whether the voting widget should be displayed for a comment.
-
jreviews:permission:comment.allows_html_in_commentFilters whether HTML content is allowed in comment text.
-
jreviews:permission:comment.autopublishFilters whether a user's comments should be automatically published without moderation.
-
jreviews:permission:comment.deleteFilters whether a user has permission to delete a comment.
-
jreviews:permission:comment.access_upload_formFilters whether a user has permission to access the media upload form for comments.
-
jreviews:permission:comment.media.autopublishFilters whether a user's media uploads to comments should be automatically published without moderation.
-
jreviews:permission:comment.manage_mediaFilters whether a user has permission to manage (edit, delete, publish) comment media.
-
jreviews:permission:comment.upload_mediaFilters whether a user has permission to upload media to comments by specifying the allowed media type.
-
jreviews:permission:comment.url_media_uploadFilters whether a user has permission to upload media to comments by providing a URL.
-
jreviews:permission:comment.link_videoFilters whether a user has permission to link videos from external sites (YouTube, Vimeo, etc.) to comments.
Comments
-
jreviews:comment_form.validationAllows adding custom validation rules to the review/comment submission form validator.code examples
-
jreviews:comment_form.before_field:{:name}Allows injecting custom HTML/content immediately before a specific custom field input in the comment/review form.
-
jreviews:comment_form.after_field:{:name}Allows injecting custom HTML/content immediately after a specific custom field input in the comment/review form.
-
jreviews:comment_form.before_commentAllows injecting custom HTML/content immediately before the main comment/review text field (editor or textarea).
-
jreviews:comment_form.bottomAllows injecting custom HTML/content at the bottom of the comment/review submission/edit form, immediately before the submit button.
-
jreviews:comments_list.before_toolbarFires before the comments toolbar and outside the HTMX swap target. Use this to inject comment filter widgets or other persistent controls that should remain stable during list refreshes.
Custom Fields
-
jreviews:listing_form.custom_fieldsFilters the collection of custom fields displayed in the listing submission/edit form, allowing add-ons to show or hide specific fields based on custom logic (e.g., pricing plans, user roles, listing state).code examples
-
jreviews:listing_form.custom_fields:{:name}Filters whether a specific custom field should be shown in the listing form. The `{:name}` placeholder is the custom field name, for example `jr_featured`. Fires for each field in the collection.code examples
-
jreviews:custom_field.output:{:name}Field-specific filter that fires for individual custom fields after the generic filter. Allows modifying output, hiding fields, or customizing display for specific fields. Returning false or null hides the field.code examples
Events Calendar
-
eventscalendar:day_view.after_titleFires in the day-view event card after the event title.
-
eventscalendar:day-view.after-last-fieldFires in the day-view event card after the last event field.
-
eventscalendar:status-badge.before-statusFires before the event status badge content.
-
eventscalendar:status-badge.after-statusFires after the event status badge content.
-
eventscalendar:month-view.before-event-titleFires in the month-view event card before the event title.
-
eventscalendar:month-view.after-event-titleFires in the month-view event card after the event title.
Field Permissions
-
jreviews:permission:field.readFilters whether a user has permission to view a custom field's output in listing or review detail pages.code examples
-
jreviews:permission:field.writeFilters whether a user has permission to see and edit a custom field in listing/review submit and edit forms.code examples
-
jreviews:permission:field.searchFilters whether a user has permission to use a custom field as a search filter in advanced search forms.
Inquiries
-
jreviews:permission:listing.inquireFilters whether a user has permission to send an inquiry about a listing.
-
jreviews:listing_inquiry_form.validationFires during listing inquiry form validation. Use `$validator->after()` callback to add custom validation rules to the inquiry submission.
-
jreviews:listing_inquiry_form.bottomFires at the bottom of the listing inquiry modal form. Use for adding custom fields or content. Output is captured via output buffering.
Listing Detail
-
jreviews:listing.detail.cover_photoFires after the listing detail data is prepared and the cover photo is resolved, but before the detail view is rendered. Use this to mutate the cover media object, preload related state, or trigger side effects tied to the listing header.
-
jreviews:listing.below-fieldsAllows injecting custom HTML/content immediately after the listing's custom field groups display.
-
jreviews:listing.below-descriptionAllows injecting custom HTML/content immediately after the listing's summary and description text.
-
jreviews:listing.below-bottommediaAllows injecting custom HTML/content immediately after all media sections (photos, videos, attachments, audio).
-
jreviews:listing.detail.mapAllows injecting map content or custom location-based content in the listing detail view. Used by Maps addon to display location maps.
-
jreviews:listing.below-editorreviewsAllows injecting custom HTML/content immediately after the editor reviews/comments section.
-
jreviews:listing.below-userreviewsAllows injecting custom HTML/content at the end of the listing detail page, after the user reviews/comments section.
-
jreviews:listing:actions.{:name}Filters the action buttons/blocks for a specific display context (detail, list, or card view).
-
jreviews:listing:meta.{:name}Filters the metadata for a specific display context (detail, list, or card view).
-
jreviews:listing:badges.{:name}Filters the status badges for a specific display context (detail, list, or card view).
Listing Permissions
-
jreviews:permission:listing.createFilters whether a user has permission to create a new listing. Return false to deny permission.code examples
-
jreviews:permission:listing.updateFilters whether a user has permission to update/edit an existing listing. Return false to deny permission.
-
jreviews:permission:listing.preview_draftFilters whether a user has permission to preview a draft listing before it's published. Return false to deny permission.
-
jreviews:permission:listing.update_listing_mediaFilters whether a user has permission to update/edit media for an existing listing. Return false to deny permission.code examples
-
jreviews:permission:listing.set_listing_titleFilters whether a user has permission to manually set a listing title. When automated title format is configured, this controls if the user can override it.
-
jreviews:permission:listing.set_listing_title_aliasFilters whether a user has permission to manually set a listing title alias (URL slug). Typically restricted to editors and admin users.
-
jreviews:permission:listing.set_listing_publication_dateFilters whether a user has permission to manually set a listing publication date. Controls when the listing becomes publicly visible.
-
jreviews:permission:listing.set_listing_expiration_dateFilters whether a user has permission to manually set a listing expiration date. Controls when the listing automatically becomes unpublished.
-
jreviews:permission:listing.allows_html_in_summary_descriptionFilters whether a user has permission to include HTML in listing summary and description fields. Controls access to WYSIWYG editor.
-
jreviews:permission:listing.modify_metadata_fieldsFilters whether a user has permission to modify SEO metadata fields (meta description and keywords) for listings.
-
jreviews:permission:listing.autopublishFilters whether a user's listing should be automatically published or require moderation. Fires for both new listings and edits to existing listings.
-
jreviews:permission:listing.deleteFilters whether a user has permission to delete a listing. Typically restricted to editors and listing owners.
-
jreviews:permission:listing.publishFilters whether a user has permission to change a listing's published status. Controls access to publish/unpublish actions.
-
jreviews:permission:listing.featureFilters whether a user has permission to mark listings as featured. Controls access to the feature/unfeature action.
-
jreviews:permission:listing.set_main_mediaFilters whether a user has permission to toggle the listing main media.
-
jreviews:permission:listing.manage_mediaFilters whether a user has permission to manage (edit, delete, publish) listing media.
-
jreviews:permission:listing.upload_mediaFilters whether a user has permission to upload media to listings by specifying the allowed media type.
-
jreviews:permission:listing.url_media_uploadFilters whether a user has permission to upload media to listings by providing a URL.
-
jreviews:permission:listing.link_videoFilters whether a user has permission to link videos from external sites (YouTube, Vimeo, etc.).
-
jreviews:permission:listing.media.autopublishFilters whether a user's media uploads should be automatically published without moderation.
-
jreviews:permission:listing.favoriteFilters whether a user has permission to use the favorites feature.
Listing Resources
-
listingresources:permission:resource.createAllows filtering whether a user can create a resource for a listing. Resources allow adding downloadable files, documents, videos, or links to listings.
-
listingresources:permission:resource.updateAllows filtering whether a user can update an existing resource. By default, editors and resource owners in allowed groups can update.
-
listingresources:permission:resource.deleteAllows filtering whether a user can delete a resource. By default, editors and resource owners in allowed groups can delete.
-
listingresources:permission:resource.autopublishAllows filtering whether a user's resources are automatically published or require moderation. By default based on the moderate_resource configuration setting.
-
listingresources:resource_form.bottomAllows adding custom HTML content at the bottom of the ListingResources resource form (create/edit). Use output buffering with `ob_start()` to capture content. Useful for adding custom fields, messages, or form elements.
-
listingresources:resource_form.validationFires during ListingResources resource form validation (resource creation/editing). Use `$validator->after()` callback to add custom validation rules beyond the default field validations.
Listings
-
jreviews:listing_form.validationAllows adding custom validation rules to the listing submission form validator.code examples
-
jreviews:listing_search_widget.has_inputFilters the boolean flag that determines whether the widget should run its live search query. Use this to require or ignore additional inputs for custom widget behavior.
-
jreviews:listing_search_widget.orderFilters the sort order used for the widget live search query. Return a valid order string to override the widget's default result ordering for the current request.
-
jreviews:listing_search_widget.live_search_paramsFilters the normalized filter param bag used by the widget live search query and its "view all" URL. Use this to add, remove, or transform widget-derived search params before execution.
-
jreviews:listing_search_widget.view_all_orderFilters the order value injected into the widget's "view all results" URL. Use this to keep the full results page aligned with custom widget ordering rules.
-
jreviews:listing_search_widget.view_all_url_paramsFilters the final URL param array used to generate the widget's "view all results" link. Use this to add custom context, rewrite params, or suppress values before the search URL is built.
-
jreviews:listing.create_complete_viewAllows addons to return custom HTML or a callable for the listing creation completion view. If a value is returned, it replaces the default success message. Useful for addons that need custom post-creation workflows or messaging.
-
jreviews:listings_list.orderFilters the effective sort order used for the listings list query. Return a valid order string to override the current request/menu order before the query is sorted.
-
jreviews:listings_list.active_filter_paramsFilters the normalized request payload used to detect active listings filters for URL syncing and active filter chip generation. Use this to add derived filter state or suppress request keys that should not be treated as active filters.
-
jreviews:listings_list.sync_url_paramsFilters the final URL param array pushed into browser history for listings lists. Use this to add custom state, remove transient params, or rewrite how list state is reflected in the URL.
-
jreviews:listings_list.has_active_filter_paramsFilters the fallback boolean used to decide whether the listings list should be treated as actively filtered. Use this to mark custom params as active filters or suppress built-in detection for specialized list states.
-
jreviews:listings_list.filter_paramsFilters the normalized listings list param array before it is passed into search/filter query logic. Use this to inject derived params, remove unsupported filters, or transform request values for custom list behavior.
-
jreviews:listings_list.active_filtersFilters the grouped active filter chip data rendered above the listings list. Use this to add custom chip groups, rename values, or remove groups that should not be exposed in the active filter UI.
-
jreviews:listing.update_complete_viewAllows addons to return custom HTML or a callable for the listing update completion view. If a value is returned, it replaces the default success message. Useful for addons that need custom post-update workflows or messaging.
-
jreviews:search_live_results.orderFilters the sort order used for the live search results query. Return a valid order string to override the widget default ordering for the current request.
-
jreviews:search_live_results.filter_paramsFilters the normalized filter param bag used by the live search query and view-all URL builder. Use this to add, remove, or transform request-derived search params before execution.
-
jreviews:search_live_results.has_inputFilters the boolean flag that determines whether live search should execute. Use this to require additional inputs, ignore certain params, or force results to load for custom scenarios.
-
jreviews:search_live_results.view_all_orderFilters the order value injected into the "view all results" URL generated from live search. Use this to align the expanded search page with custom live result ordering rules.
-
jreviews:search_live_results.view_all_url_paramsFilters the final URL param array used to generate the "view all results" link from live search. Use this to inject custom context, remove params, or rewrite the transition to the full results page.
-
jreviews:search.build_url.paramsFilters the final normalized URL param array before the search results URL is generated. Use this to add custom query params, remove transient state, or rewrite the final search URL payload.
-
jreviews:listing.data_before_saveAllows filtering and modifying listing data array before it's saved to database. Useful for automated data processing, calculations, and field dependencies.code examples
-
jreviews:filters.resolve_active_filtersFilters the active filter array extracted from the current request before scope-sensitive params are removed. Use this to add derived filters, strip request noise, or normalize widget/page state.
-
jreviews:search.parse_request_filtersFilters the parsed custom field filter payload extracted from a search request. Use this to inject derived field filters, drop unsupported params, or adjust AND/OR match flags before downstream consumers use them.
-
jreviews:search.apply_filtersFilters the boolean state that tracks whether the current search request applied any filters. Use this to account for custom query modifications performed by addons or to mark additional request conditions as active filters.
-
jreviews:search_live_results.title_metaFires below each listing title in the live search results dropdown. Use this to render compact metadata such as category hints, distance, price, or addon-specific labels.
-
jreviews:listing_form.topAllows injecting custom HTML/content at the top of the listing submission/edit form, immediately after the form opening tag.
-
jreviews:listing_form.before_field:{:name}Allows injecting custom HTML/content immediately before a specific custom field input in the listing form.
-
jreviews:listing_form.after_field:{:name}Allows injecting custom HTML/content immediately after a specific custom field input in the listing form.
-
jreviews:listing_form.bottomAllows injecting custom HTML/content at the bottom of the listing submission/edit form, immediately before the submit button.
-
jreviews:listings_list.before_toolbarFires before the listings toolbar and outside the HTMX swap target. Use this to inject filter widgets, toolbars, or other persistent controls that should survive list refreshes.
-
jreviews:listings_list.title_metaFires immediately below the listing title in listings list layouts. Use this to render supplemental title metadata such as distance, badges, pricing, or addon-specific labels.
-
jreviews:listings_list.card_metadataFires inside the listing card metadata area after the built-in metadata block. Use this for addon metadata such as map distance, proximity labels, or custom counters.
-
jreviews:listings_list.after_listingsFires after the listings grid or table has rendered, but before pagination. Use this to append summaries, banners, CTAs, or addon output tied to the current result set.
-
jreviews:listings_list.map_panelFires in the secondary column beside the listings results. Used by the Maps addon to render the split-view map panel, but can also be used for any synchronized side panel tied to the current list state.
-
jreviews:listing.bypass-render.wordpress
MapsPro
-
maps:user_geolocationFilters the resolved user geolocation payload for map geo-targeting. Also fired via the legacy `Clickfwd\Hook` system as `user_geolocation` for V5 compatibility (the legacy call is slated for removal in V7).code examples
-
maps:google_api_urlFilters the Google Maps API base URL used for geocoding requests.
Media
-
jreviews:validation_rules:listing.url_media_uploadFilters validation rules when users upload media files from remote URLs to listings. Allows adding custom validation rules beyond the default file type, size, and URL format checks.
-
jreviews:validation_rules:comment.url_media_uploadFilters validation rules when users upload media files from remote URLs to comments. Allows adding custom validation rules beyond the default file type, size, and URL format checks.
-
jreviews:validation_rules:listing.temporary_media_uploadFilters validation rules when users upload media files (images, videos, audio, documents) to listings. Allows adding custom validation rules beyond the default file type and size checks.
-
jreviews:validation_rules:comment.temporary_media_uploadFilters validation rules when users upload media files (images, videos, audio, documents) to comments. Allows adding custom validation rules beyond the default file type and size checks.
-
jreviews:listing_uploader.bottomFires at the bottom of the dedicated listing media uploader form. Use for adding custom fields or content.
-
jreviews:media.data_before_saveAllows filtering and modifying media data array before it's saved to database. Useful for automated media processing and metadata manipulation.code examples
Media Permissions
-
jreviews:permission:media.downloadFilters whether a user has permission to download a media file.
-
jreviews:permission:media.publishFilters whether a user has permission to publish media (make it visible to the public).
-
jreviews:permission:media.deleteFilters whether a user has permission to delete media.
-
jreviews:permission:media.set_main_mediaFilters whether a user has permission to set a media item as the main listing image.
-
jreviews:permission:media.set_media_functionFilters whether a user has permission to set media function as cover photo or logo.
MyLists
-
mylists:permission:list.create_user_listFilters whether a user has permission to create a user list (MyList) for a specific listing.
-
mylists:permission:list.updateFilters whether a user has permission to update/edit a MyList (user list or site list).
-
mylists:permission:list.deleteFilters whether a user has permission to delete a MyList (user list or site list).
-
mylists:permission:list.manage_listingsFilters whether a user has permission to add or remove listings from a MyList.
-
mylists:permission:list.publishFilters whether a user has permission to publish a user list (make it visible to the public).
-
mylists:permission:list.make_privateFilters whether a user has permission to make a MyList private (visible only to the owner).
-
mylists:permission:list.autopublishFilters whether a user's MyLists should be automatically published without moderation.
-
mylists:list_form.validationFires during MyList form validation (user list creation/editing). Use `$validator->after()` callback to add custom validation rules.
-
mylists:component_spin_initFires when a MyLists Yoyo component (list buttons / add-to-list dropdown) spins up; re-triggers the legacy `site_init` lifecycle for V6 listeners — NOT a general page-load or core init event. Also fired via the legacy `Clickfwd\Hook` system as `site_init` for V5 compatibility (legacy call removed in V7).code examples
-
mylists:on-favorites-migrationFilters a favorite migration row before it is written to a MyLists list. Also fired via the legacy `Clickfwd\Hook` system as `mylists:on-favorites-migration` for V5 compatibility (the legacy call is slated for removal in V7).code examples
-
mylists:list_form.bottomAllows injecting custom content at the bottom of the MyLists create/add-to-list modal form.
Other
-
jreviews-cp:layouts.listFilters the available listing list layout options shown in Control Panel dropdowns. Allows addons to add custom layout options.
-
jreviews:listing:before_renderFires during the CMS "before render" event after the listing detail template has been rendered to HTML but before the complete page is sent to the browser. Use this hook for side effects like logging, webhooks, analytics, or notifications. You cannot modify the template content at this point as it's already been rendered.
-
jreviews:listings_list.queryFilter the listings list query before execution.
-
jreviews:listings_list.resultsFilter the listing results after query execution.
-
jreviews:listings_list.order_optionsFilter the listing sort options.
-
jreviews:validation_rules:listing.link_video_uploadFilters validation rules when users link videos from external platforms (YouTube, Vimeo, etc.) to listings. Allows adding custom validation rules beyond the default checks.
-
jreviews:validation_rules:comment.link_video_uploadFilters validation rules when users link videos from external platforms (YouTube, Vimeo, etc.) to comments. Allows adding custom validation rules beyond the default checks.
-
jreviews:encoding.ffmpeg_mp4_audio_codecFilters the audio codec used when encoding MP4 videos. Also fired via the legacy `Clickfwd\Hook` system as `ffmpeg_mp4_audio_codec` for V5 compatibility (the legacy call is slated for removal in V7).code examples
-
jreviews:encoding.ffmpeg_mp4_video_codecFilters the video codec used when encoding MP4 videos. Also fired via the legacy `Clickfwd\Hook` system as `ffmpeg_mp4_video_codec` for V5 compatibility (the legacy call is slated for removal in V7).code examples
-
import:listing.data_before_saveFilters listing data during CSV import before saving to database. Custom fields are in $data['fields'] as arrays (converted from asterisk format). Standard fields are at root level. Must return data with same structure.
Owner Replies
-
jreviews:permission:comment.reply_as_ownerFilters whether a user has permission to reply to a comment as the listing owner.
-
jreviews:permission:comment.owner_reply.autopublishFilters whether a user's owner replies should be automatically published without moderation.
-
jreviews:comment_owner_reply_form.validationFires during owner reply form validation. Use `$validator->after()` callback to add custom validation rules.
-
jreviews:comment_owner_reply_form.bottomFires at the bottom of owner reply modal form. Use for adding custom fields or content.
Reports
-
jreviews:permission:media.reportFilters whether a user has permission to report media as inappropriate.
-
jreviews:permission:media.likeFilters whether a user has permission to like/favorite media.
-
jreviews:permission:comment.reportFilters whether a user has permission to report a comment as inappropriate.
-
jreviews:permission:comment.see_comments_fieldFilters whether the comments/review text field should be visible in forms.
-
jreviews:comment_report_form.validationFires during comment report form validation. Use `$validator->after()` callback to add custom validation rules.
-
jreviews:comment_report_form.bottomFires at the bottom of comment report modal form. Use for adding custom fields or content.
-
jreviews:comment_discussion_report_form.validationFires during comment discussion report form validation. Use `$validator->after()` callback to add custom validation rules.
-
jreviews:comment_discussion_report_form.bottomFires at the bottom of comment discussion report modal form. Use for adding custom fields or content.
-
jreviews:media_report_form.validationFires during media report form validation. Use `$validator->after()` callback to add custom validation rules.
-
jreviews:media_report_form.bottomFires at the bottom of media report modal form. Use for adding custom fields or content.
System
-
jreviews:response_contentFilters the final response body immediately before headers and content are sent to the browser. Use this to post-process rendered HTML for modern routes, mirroring the legacy `after_filter_output` behavior.
-
jreviews:listing:structured_dataAllows filtering the Schema.org structured-data array before JSON-LD conversion. The array represents the complete assembled output for the listing's primary schema type plus admin-configured enrichments; modify or remove entries to control what's emitted.code examples
-
jreviews-cp:browse-listings.after-categoryAllows injecting custom HTML/content in the control panel browse listings table, after the category name in each row.
-
jreviews:listing.bypass-render.joomlaAllows bypassing the default JReviews listing detail page rendering to implement custom output. When filter returns true, JReviews skips its template processing and you must handle the page output yourself.code examples
-
jreviews:category.bypass-render.joomlaJoomla-specific hook to bypass category page rendering when addons need to handle category routes differently. When true is returned, the category page will not render.