🎯 Need Help?

Get Premium Support

Priority assistance from the developer

⬆️ Upgrade

Unlock all features

More from ANWP

Sports Leagues Premium

Multi-sport league management with advanced statistics

Learn more →

AnWP SL Theme Kit

Starter themes & block patterns for Sports Leagues

Learn more →

Hooks


Football Leagues renders its pages from PHP templates, and those templates fire WordPress filters and actions you can hook into. This page documents the stable ones: what each passes, where it fires, and what a working callback looks like. It’s for people who write custom PHP or maintain theme template overrides. If you’re looking for on/off switches, those live in Settings & Tools > Settings, not here.

Reach for a hook before you copy a template

A hook survives plugin updates. A copied template freezes at the version you copied it from and stops receiving fixes. If you already have overrides, Settings & Tools > Template Status (PRO) lists every one of them and how many versions behind it is.

🚀 Before you start

  • Where callbacks go. A child theme’s functions.php, or a small site-specific plugin. Never inside a template you copied into the theme.
  • The theme override folder is yourtheme/anwp-football-leagues/ – the old plugin folder name, kept as a public path. Not football-leagues-by-anwppro.
  • Copying a template removes the hooks inside it. Most anwpfl/tmpl-* hooks are fired from template files, not from PHP classes. Override club/club-header.php in your theme and you silently drop anwpfl/tmpl-club/fields_top and fields_bottom for every other plugin on the site.
  • Timing. Almost every hook here fires mid-request, so a file-scope add_filter() in functions.php is in time. Two are read inside a class constructor instead – anwpfl/player/use_short_name and anwpfl/cache/is_active – and those classes are built on init priority 0. A theme loads during setup_theme, so file-scope registration still wins. A callback you add from inside another init callback does not.

🎯 Reorder or remove sections on a page

Every entity page is a list of section slugs. The template walks that list and loads one partial per slug, so slug stats loads templates/match/match-stats.php. Filter the list and you reorder, remove or repeat blocks without touching a single template file.

FilterArgumentsFired at
anwpfl/tmpl-match/sectionsarray $sections, array $game_data, WP_Post $game_postcore templates/content-match.php:78
premium :141
anwpfl/tmpl-club/sectionsarray $club_sections, array $datacore templates/content-club.php:86
premium :102
anwpfl/tmpl-player/sectionsarray $player_sections, array $player_data, int $player_idcore templates/content-player.php:91
premium :90
anwpfl/tmpl-referee/sectionsarray $staff_sections, int $staff_idcore templates/content-referee.php:54
anwpfl/tmpl-staff/sectionsarray $staff_sections, int $staff_idcore templates/content-staff.php:56
anwpfl/tmpl-stadium/sectionsarray $stadium_sections, int $stadium_idcore templates/content-stadium.php:45

Default section lists

PRO ships more blocks than the free plugin, so the list you receive depends on which plugins are active. Both are shown here in render order.

PageFree pluginWith PRO
Matchgoals, penalty_shootout, missed_penalties, lineups, substitutes, missing, referees, video, cards, stats, summary, gallery, latesttimeline, goals, penalty_shootout, missed_penalties, formation, lineups, substitutes, missing, referees, video, cards, stats, player-stats, summary, gallery, latest, h2h, commentary, custom-code
Clubheader, description, fixtures, latest, squad, galleryheader, description, game-stats, fixtures, latest, squad, stats, gallery, transfers
National teams and other “summary” clubs get the free list instead.
Playerheader, description, stats, matches, missed, galleryheader, stats_panel, description, stats, matches, missed, gallery
Refereeheader, fixtures, finished, description
Staffheader, description, history
Stadiumheader, description, fixtures, latest, gallery, map

A working example

Move the statistics block up under the goals, and drop the gallery. Because it edits the array it receives instead of returning a fixed one, this snippet behaves correctly on both the free plugin and PRO:

add_filter( 'anwpfl/tmpl-match/sections', function ( $sections ) {

	// Pull 'stats' out, then re-insert it right after 'goals'.
	$sections = array_values( array_diff( $sections, [ 'stats' ] ) );
	$position = array_search( 'goals', $sections, true );

	array_splice( $sections, false === $position ? 0 : $position + 1, 0, [ 'stats' ] );

	// Drop the gallery entirely.
	return array_values( array_diff( $sections, [ 'gallery' ] ) );
} );

Older snippets you may find online return a hard-coded array instead. Don’t copy those. The free plugin’s match list has 13 entries and the PRO list has 19, so a hard-coded free-plugin array deletes six blocks the moment PRO is activated – the timeline, formation, player stats, head-to-head, commentary and custom code – and nothing tells you it happened.

Slugs are filenames

The canonical list of slugs for a page is the contents of that entity’s template folder, with the entity prefix stripped. Match sections live in templates/match/match-*.php, club sections in templates/club/club-*.php, and so on. To list what a given install actually has:

ls wp-content/plugins/football-leagues-by-anwppro/templates/match/
ls wp-content/plugins/football-leagues-by-anwppro-premium/templates/match/

Files with a double dash (match--slim.php, match--small.php) are card layouts used in match lists, not page sections. Reordering and removing are the safe operations; adding a slug only works if a partial of that name exists.

A slug with no file renders nothing, silently

The loader returns false for a missing partial and moves on. No warning, no log entry, no gap in the markup – the block is just gone. The classic case is line_ups: the lineups partial is match-lineups.php, so the slug is lineups. line_ups still works in the [anwpfl-match sections="..."] shortcode, which keeps it as a legacy alias, but in this filter it drops your lineups block.

If your snippet never worked on a PRO site

Between January 2020 and Premium 0.18.4, PRO’s own copies of the Match, Club and Player content templates didn’t fire sections, before_wrapper or after_wrapper. Because PRO templates take priority over the free ones, a snippet targeting those hooks did nothing on a PRO site and everything on a free one, with no error either way. All eight hooks fire again as of Premium 0.18.4, on both plugins. If you worked around it by copying a template, you can now delete the copy.

Replace a whole page

Three hooks control whether Football Leagues renders one of its own pages at all. This is the seam the Layout Builder itself uses, so it’s a supported way to hand a single entity page to your own code.

HookKindWhat it doesFired at
anwpfl/template/loading_checkfilterArray of booleans deciding whether the plugin takes over the_content at all. Every value must be truthy. Add false to stand down completely.core includes/class-anwpfl-template.php:362
anwpfl/template/load_default_templatefilter(bool $load, string $post_type, WP_Post $post). Return false to skip the built-in template.core includes/class-anwpfl-template.php:365
anwpfl/template/load_alt_templateaction(string $post_type, WP_Post $post). Fires only when the filter above returned false. Echo your own markup here.core includes/class-anwpfl-template.php:377
add_filter( 'anwpfl/template/load_default_template', function ( $load, $post_type, $post ) {

	return 'anwp_stadium' === $post_type ? false : $load;
}, 8, 3 );

add_action( 'anwpfl/template/load_alt_template', function ( $post_type, $post ) {

	if ( 'anwp_stadium' === $post_type ) {
		echo my_theme_render_stadium( $post->ID ); // Already escaped.
	}
}, 8, 2 );

Pick your priority deliberately. Layout Builder v2 claims pages on this filter at priority 9 and Layout Builder v1 at priority 10. A callback at 10 or later runs after a builder has already claimed the page, so use 8 or lower to win, or 11 and up to defer to any layout the site owner has built.

Inject markup into a page

These fire at fixed points inside the rendered page. Echo directly from the callback – the output lands where the hook sits.

HookKindArgumentsFired at
anwpfl/tmpl-match/render_headerfilterbool $render, WP_Post $game_postcore templates/content-match.php:51, premium :91
anwpfl/tmpl-match/after_headeractionWP_Post $game_post, array $game_datacore templates/content-match.php:55, premium :103
anwpfl/match/match-header-bottomactionint $match_id, array $datacore templates/match/match.php:264, premium :282
anwpfl/tmpl-match/lineups_after_headeractionarray $datacore templates/match/match-lineups.php:107, premium :121
anwpfl/tmpl-club/fields_topactionWP_Post $club, array $datacore templates/club/club-header.php:77, premium :93
anwpfl/tmpl-club/fields_bottomactionWP_Post $club, array $datacore templates/club/club-header.php:234, premium :250
anwpfl/tmpl-stadium/fields_topactionWP_Post $stadiumcore templates/stadium/stadium-header.php:54
anwpfl/tmpl-stadium/fields_bottomactionWP_Post $stadiumcore templates/stadium/stadium-header.php:187
anwpfl/tmpl-competition/after_group_standingactionobject $group, object $competition, int $competition_post_idcore templates/content-competition.php:341 and content-competition--tabs.php:311

The club and stadium fields_top / fields_bottom pair sits inside the header’s field grid, so echo a matching pair of divs (a label cell and a value cell) rather than a block of your own.

add_action( 'anwpfl/tmpl-club/fields_bottom', function ( $club, $data ) {

	$nickname = get_post_meta( $club->ID, '_my_club_nickname', true );

	if ( ! $nickname ) {
		return;
	}

	echo '<div class="club-header__option-title anwp-text-sm">Nickname</div>';
	echo '<div class="club-header__option-value">' . esc_html( $nickname ) . '</div>';
}, 10, 2 );

Page wrappers

Every entity page brackets its output with a pair of actions, outside the plugin’s .anwp-b-wrap container. They’re the right place for a banner above a page or extra content below it. The plugin uses after_wrapper itself to print the Custom Content Below field on Match, Club and Player.

PageHooksArgument passed
Matchanwpfl/tmpl-match/after_wrapper onlyWP_Post
Clubanwpfl/tmpl-club/before_wrapper, after_wrapperWP_Post
Stadiumanwpfl/tmpl-stadium/after_wrapper onlyWP_Post
Playeranwpfl/tmpl-player/before_wrapper, after_wrapperint post ID
Competitionanwpfl/tmpl-competition/before_wrapper, after_wrapperint post ID
Refereeanwpfl/tmpl-referee/before_wrapper, after_wrapperint post ID
Staffanwpfl/tmpl-staff/before_wrapper, after_wrapperint post ID
Standinganwpfl/tmpl-standing/before_wrapper, after_wrapperint post ID

The wrapper hooks don’t all pass the same thing

Club, match and stadium hand you a WP_Post; player, competition, referee, staff and standing hand you an integer post ID. Copy a club callback onto a player and $player->ID is a fatal error, not a warning. Write $id = is_object( $arg ) ? $arg->ID : (int) $arg; if you want one callback on several hooks.

The match header on a PRO site

anwpfl/tmpl-match/render_header looks like a simple on/off switch, and on the free plugin it is. PRO replaces the plain header with its scoreboard by forcing that filter to false and rendering its own markup on after_header. So on a PRO site, returning true from a later callback brings the plain header back but leaves the scoreboard in place – you get both. To get only the plain core header you have to undo both halves:

add_action( 'wp', function () {

	if ( ! function_exists( 'anwp_fl_pro' ) ) {
		return;
	}

	remove_filter( 'anwpfl/tmpl-match/render_header', '__return_false' );
	remove_action( 'anwpfl/tmpl-match/after_header', [ anwp_fl_pro()->match, 'render_scoreboard' ], 10 );
} );

Change the data a template receives

FilterArgumentsFired at
anwpfl/tmpl-club/data_fieldsarray $data, WP_Post $clubcore templates/content-club.php:52 and templates/shortcode-club.php:75; premium templates/content-club.php:52 and includes/class-anwpfl-premium-club.php:575
anwpfl/tmpl-competition/competitions_preparedarray $competitions, int $competition_post_id, bool $is_multistage, array $matchescore templates/content-competition.php:46 and content-competition--tabs.php:46

anwpfl/tmpl-club/data_fields is the club hook with the widest reach – it’s the one place fired by the club page, the club shortcode and the PRO club header alike. Note that the shortcode copy casts the result to an object, so return an array and let the template do the casting.

add_filter( 'anwpfl/tmpl-club/data_fields', function ( $data, $club ) {

	$data['website'] = get_post_meta( $club->ID, '_my_official_site', true ) ?: $data['website'];

	return $data;
}, 10, 2 );

anwpfl/tmpl-competition/competitions_prepared receives the list of stages a multi-stage competition page is about to render, already ordered. Use it to hide a stage, reorder them, or append one from elsewhere.

Naming, config and assets

FilterWhat it controlsFired at
anwpfl/player/use_short_nameWhether player names render in their short form site-wide. Default true. Read in the constructor – register at file scope.core includes/class-anwpfl-player.php:38
anwpfl/club/use_club_abbrWhether club abbreviations are used where a short name is needed. Default true.core includes/class-anwpfl-club.php:2296, :2352
anwpfl/config/countriesThe country list used by every country selector and flag.core includes/class-anwpfl-data.php:724
anwpfl/config/positionsActive player position codes, in display order. Unknown codes are dropped and g is always kept. Since 0.18.4.core includes/class-anwpfl-data.php:1019
anwpfl/config/game_special_statusesThe special status list – PST, TBD, CANC by default.core includes/class-anwpfl-data.php:1371
anwpfl/assets/load_legacy_bootstrapWhether the legacy Bootstrap stylesheet is enqueued.core includes/class-anwpfl-assets.php:228
anwpfl/assets/load_legacy_gridWhether the legacy grid stylesheet is enqueued.core includes/class-anwpfl-assets.php:259

The two legacy stylesheets are opt-out, not opt-in: both load unless the matching Appearance setting is set to “no”. Returning false from the filter is the code-side way to drop them, which is worth about 45 KB of CSS on a theme that doesn’t need them.

add_filter( 'anwpfl/assets/load_legacy_bootstrap', '__return_false' );
add_filter( 'anwpfl/assets/load_legacy_grid', '__return_false' );

// Add two positions to the pickers, keeping the plugin's own.
add_filter( 'anwpfl/config/positions', function ( $codes ) {

	return array_merge( $codes, [ 'cb', 'cm' ] );
} );

React to data changes

ActionArgumentsCoversFired at
anwpfl/match/on_savearray $data, array $post_dataAdmin game editor only.core includes/class-anwpfl-match.php:1069
anwpfl/match/insertedint $match_id, array $dataEvery path that creates a game – admin, CSV import, API import, Import Matches.core includes/class-anwpfl-match.php:1586
anwp_fl_edit_postint $post_id, WP_Post $postFront-end match editing and API import updates. The plugin’s own cache listens here.premium includes/class-anwpfl-premium-match-public.php:460, :681; includes/class-anwpfl-premium-api-data.php:2537, :2770
anwpfl/club/on_saveint $post_id, array $_POSTClub saved in the admin.core includes/class-anwpfl-club.php:1040
anwpfl/player/on_saveint $post_id, array $_POSTPlayer saved in the admin.core includes/class-anwpfl-player.php:675
anwpfl/standing/on_savearray $data, int $post_idStanding table saved.core includes/class-anwpfl-standing.php:2485

Games have two save paths, and only one fires anwpfl/match/on_save

The admin game editor fires it. Front-end match editing, live reporting and API import don’t – they call the individual save methods directly. A listener on anwpfl/match/on_save that assumes it sees every write will silently miss every imported and front-end-edited game. Use anwpfl/match/inserted to catch every new game and anwp_fl_edit_post to catch front-end and API edits.

add_action( 'anwpfl/match/inserted', function ( $match_id, $data ) {

	if ( empty( $data['finished'] ) ) {
		my_addon_queue_preview_image( (int) $match_id );
	}
}, 10, 2 );

add_action( 'anwp_fl_edit_post', function ( $post_id, $post ) {

	my_addon_purge_external_cdn( $post->post_type, (int) $post_id );
}, 10, 2 );

Caching

FilterWhat it doesFired at
anwpfl/cache/is_activeMaster switch for the plugin’s own cache layer. Read in the constructor – register at file scope.core includes/class-anwpfl-cache.php:71
anwpfl/cache/expiration_maparray $map, string $cache_group, string $cache_key. Keys are the part of the cache key before __. Anything unlisted falls back to one hour.core includes/class-anwpfl-cache.php:216
anwpfl/cache/excluded_keysArray of cache keys to never read or write. Useful to isolate one slow query while you debug it.core includes/class-anwpfl-cache.php:122, :152
add_filter( 'anwpfl/cache/expiration_map', function ( $map ) {

	$map['FL-PLAYER_get_birthdays'] = WEEK_IN_SECONDS;

	return $map;
} );

Register templates from a plugin

A theme needs no filter – drop a copy of the file into yourtheme/anwp-football-leagues/ and it wins. A plugin that ships its own Football Leagues templates registers its folder on anwpfl_template_paths, which is an array keyed by priority, lowest wins:

PriorityLocation
1Child theme anwp-football-leagues/
10Parent theme anwp-football-leagues/
50Football Leagues PRO templates/
100Football Leagues (free) templates/
add_filter( 'anwpfl_template_paths', function ( $file_paths ) {

	// Beat PRO, lose to the theme.
	$file_paths[30] = plugin_dir_path( __FILE__ ) . 'fl-templates/';

	return $file_paths;
} );

The filter is applied in two places: the template loader (vendor/class-gamajo-template-loader.php:293) and the Template Status scanner (includes/class-anwpfl-template-status.php:140). Registering a path correctly means your plugin’s templates also show up on the Template Status screen with their version state, which is the main reason to use the filter instead of filtering the final path.

How to tell whether a hook still fires

A retired hook never warns you

Football Leagues has never used WordPress’s apply_filters_deprecated() or do_action_deprecated() wrappers, so a hook that stops being fired raises no _doing_it_wrong notice and writes nothing to debug.log. Your callback simply never runs. The only reliable check is to grep the plugin.

grep -rn "anwpfl/tmpl-match/sections" wp-content/plugins/football-leagues-by-anwppro*/

Lines containing apply_filters or do_action are the places the hook fires. Lines containing add_filter or add_action are the plugin’s own listeners – they prove nothing about whether the hook is still emitted. Search for the hook name alone rather than apply_filters( 'anwpfl/..., because some calls put the name on its own line. If you bought PRO and never installed the free plugin separately, PRO carries its own copy of the free plugin in football-leagues-by-anwppro-premium/core/ – search there too.

Three hooks are known to be gone. anwpfl/tmpl-match/sections_tabs was removed with the match tab layout and no longer exists. anwpfl/standing/cached_meta_keys and anwpfl/standing/fields_to_clone stopped being applied in 0.18.0, when standings moved to a custom table – nothing replaces them, because the data they described is no longer in postmeta.

Full hook reference

These hooks are real and safe to use, but each is a single extension point in a single template and gets no worked example here – the name and the location are enough. Arguments and @since tags are in the docblock at each line.

Competition page

All core-only, fired from both templates/content-competition.php and content-competition--tabs.php. Line numbers below are the non-tabs file. Every render_* filter returns a boolean – return false and that piece is skipped.

HookKindWhat it doesLine
anwpfl/tmpl-competition/before_headeractionBefore the competition header block.67
anwpfl/tmpl-competition/render_headerfilterSkip the competition header.76
anwpfl/tmpl-competition/after_headeractionAfter the competition header block.95
anwpfl/tmpl-competition/before_stageactionBefore each stage of a multi-stage competition.111
anwpfl/tmpl-competition/render_stage_titlefilterSkip a stage title.122
anwpfl/tmpl-competition/after_stage_titleactionAfter a stage title.148
anwpfl/tmpl-competition/before_roundactionBefore each knockout round.203
anwpfl/tmpl-competition/render_round_titlefilterSkip a round title.217
anwpfl/tmpl-competition/before_groupactionBefore each group.248
anwpfl/tmpl-competition/before_group_titleactionBefore a group title.263
anwpfl/tmpl-competition/render_group_titlefilterSkip a group title.277
anwpfl/tmpl-competition/after_group_titleactionAfter a group title.302
anwpfl/tmpl-competition/render_group_standingfilterSkip a group’s standing table.314
anwpfl/tmpl-competition/render_list_of_matchesfilterSkip the match list.353
anwpfl/tmpl-competition/after_list_of_matchesactionAfter the match list.396

Club page blocks

HookKindWhat it doesFired at
anwpfl/tmpl-club/before_headeractionBefore the club header.core club/club-header.php:55, premium :66
anwpfl/tmpl-club/before_fixturesactionBefore the fixtures block.core club/club-fixtures.php:40, premium :39
anwpfl/tmpl-club/render_fixturesfilterSkip the fixtures block.core club/club-fixtures.php:51, premium :50
anwpfl/tmpl-club/fixtures_limitfilterHow many fixtures the block shows. Default 10.core club/club-fixtures.php:80, premium :74
anwpfl/tmpl-club/before_latestactionBefore the latest-results block.core club/club-latest.php:40, premium :40
anwpfl/tmpl-club/render_latestfilterSkip the latest-results block.core club/club-latest.php:42, premium :42
anwpfl/tmpl-club/before_squadactionBefore the squad block.core club/club-squad.php:39, premium :39
anwpfl/tmpl-club/render_squadfilterSkip the squad block.core club/club-squad.php:50, premium :50
anwpfl/tmpl-club/squad_layoutfilterOverride the squad layout for this club.core club/club-squad.php:66, premium :66
anwpfl/tmpl-club/after_squadactionAfter the squad block. PRO only.premium club/club-squad.php:89
anwpfl/tmpl-club/before_statsactionBefore the club statistics block. PRO only.premium club/club-stats.php:70
anwpfl/tmpl-club/before_galleryactionBefore the gallery block.core club/club-gallery.php:54

Match sections and match cards

HookKindWhat it doesFired at
anwpfl/tmpl-match/goals_beforeactionBefore the goals section.core match/match-goals.php:61
anwpfl/tmpl-match/cards_beforeactionBefore the cards section.core match/match-cards.php:51
anwpfl/tmpl-match/substitutes_beforeactionBefore the substitutes section.core match/match-substitutes.php:47
anwpfl/tmpl-match/referees_beforeactionBefore the referees section.core match/match-referees.php:55
anwpfl/tmpl-match/summary_beforeactionBefore the summary section.core match/match-summary.php:39
anwpfl/tmpl-match/video_beforeactionBefore the video section.core match/match-video.php:41
anwpfl/tmpl-match/lineups_beforeactionBefore the lineups section.core match/match-lineups.php:81, premium :96
anwpfl/tmpl-match/stats_beforeactionBefore the statistics section.core match/match-stats.php:75, premium :66
anwpfl/tmpl-match/h2h_beforeactionBefore the head-to-head section. PRO only.premium match/match-h2h.php:39
anwpfl/tmpl-match-slim/extra_actionfilterHTML in the action slot of a slim match card.core match/match--slim-footer.php:79
anwpfl/tmpl-match-slim/bottomactionBottom line of a slim match card.core match/match--slim-footer.php:87
anwpfl/tmpl-match-small/extra_actionfilterHTML in the action slot of a small match card.core match/match--small.php:78, premium :96
anwpfl/tmpl-match-small/bottomactionBottom line of a small match card.core match/match--small.php:283, premium :301

Player, referee and staff headers

HookKindWhat it doesFired at
anwpfl/tmpl-player/before_headeractionBefore the player header.core player/player-header.php:69, premium :75 and player-header--compact.php:68
anwpfl/tmpl-player/before_galleryactionBefore the player gallery.core player/player-gallery.php:47
anwpfl/tmpl-player/render_main_photo_captionfilterWhether the main-photo caption renders. Despite the name it also governs the referee and staff headers.core player/player-header.php:82, referee/referee-header.php:64, staff/staff-header.php:77

Standing tables

The first three are the add-on surface introduced with the 0.18.0 standings rewrite and are described with more context in the v0.18.0 migration guide.

HookKindWhat it doesFired at
anwpfl/standing/row_templatefilterPre-declare extra counters on every empty standing row before matches are counted.core includes/class-anwpfl-standing.php:1288
anwpfl/standing/accumulate_match_statsactionFires once per match while the table is built. The first two arguments are passed by reference – declare them as &$row_home, &$row_away.core includes/class-anwpfl-standing.php:1451
anwpfl/standing/post_compute_tablefilterFires after ordering and place assignment, for columns that need the finished table.core includes/class-anwpfl-standing.php:1714
anwpfl/standing/derived_columnsfilterDisplay-ready extra column values, per row. Since 0.18.5.core includes/class-anwpfl-standing.php:387
anwpfl/standing/column_headersfilterHeader text and tooltip for every column slug. A slug with no header renders a blank header cell, not an error. Since 0.18.5.core includes/class-anwpfl-data.php:858
anwpfl/standing/custom_position_calculationfilterReturn true to replace the built-in sort engine.core includes/class-anwpfl-standing.php:1589
anwpfl/standing/custom_position_calculation_tablefilterYour sorted table, used only when the filter above returned true.core includes/class-anwpfl-standing.php:1600
anwpfl/tmpl-standing/columns_orderfilterWhich columns render, in order.core templates/shortcode-standing.php:81 (and the mini, PRO and inner standing templates)
anwpfl/tmpl-standing/columns_pinnedfilterColumns the narrow-screen auto-fit may never drop. Since 0.18.5.core templates/shortcode-standing.php:104 (and the mini, PRO and inner standing templates)

Everything else

HookKindWhat it doesFired at
anwpfl/config/permalinksfilterThe CPT slug map used to build plugin permalinks.core includes/class-anwpfl-options.php:386
anwpfl/config/load_plyrfilterWhether the Plyr video player is registered. Default true.core includes/class-anwpfl-assets.php:380
anwpfl/rest/check_permissionsfilterThe permission verdict for plugin REST routes, with $context, $post_id and $post_type.core includes/class-anwpfl-helper.php:2488
anwpfl/thumbnail/look_for_everywherefilterReturn true to let plugin entities supply a featured image outside search and archive pages.core class-anwp-football-leagues.php:861
anwp-football-leagues/config/cpt_only_admin_accessfilterWhether plugin post types stay locked to manage_options. Default true. Note the unusual prefix.core includes/class-anwpfl-player.php:92
anwpfl/template/debug_enabledfilterTurn on the per-template profiler without defining a constant.core includes/class-anwpfl-template.php:220
anwpfl/template/debug_min_queriesfilterQuery-count threshold below which the profiler stays quiet.core includes/class-anwpfl-template.php:324

What this page doesn’t cover

Football Leagues fires more than 260 distinct hooks across both plugins. Around 150 of them are deliberately left out of this reference: API import tuning knobs, Vue app wiring, metabox splices, shortcode-builder internals, upgrade and diagnostics plumbing, and the coordination hooks the Layout Builder engine uses. They’re wiring between the plugin’s own moving parts, they change between releases without notice, and documenting one would turn it into a promise we don’t intend to keep. If you find one in the source and it’s the only way to do what you need, ask on the support forum first – there’s often a supported hook nearby, and if there isn’t, that’s a good reason to add one.

Layout Builder v2 blocks are the one deliberate exception. They carry no hooks of their own and are extended through a single filter, documented separately in Layout Builder Block Filter.

📚 Related