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. Notfootball-leagues-by-anwppro. - Copying a template removes the hooks inside it. Most
anwpfl/tmpl-*hooks are fired from template files, not from PHP classes. Overrideclub/club-header.phpin your theme and you silently dropanwpfl/tmpl-club/fields_topandfields_bottomfor every other plugin on the site. - Timing. Almost every hook here fires mid-request, so a file-scope
add_filter()infunctions.phpis in time. Two are read inside a class constructor instead –anwpfl/player/use_short_nameandanwpfl/cache/is_active– and those classes are built oninitpriority 0. A theme loads duringsetup_theme, so file-scope registration still wins. A callback you add from inside anotherinitcallback 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.
| Filter | Arguments | Fired at |
|---|---|---|
anwpfl/tmpl-match/sections | array $sections, array $game_data, WP_Post $game_post | core templates/content-match.php:78premium :141 |
anwpfl/tmpl-club/sections | array $club_sections, array $data | core templates/content-club.php:86premium :102 |
anwpfl/tmpl-player/sections | array $player_sections, array $player_data, int $player_id | core templates/content-player.php:91premium :90 |
anwpfl/tmpl-referee/sections | array $staff_sections, int $staff_id | core templates/content-referee.php:54 |
anwpfl/tmpl-staff/sections | array $staff_sections, int $staff_id | core templates/content-staff.php:56 |
anwpfl/tmpl-stadium/sections | array $stadium_sections, int $stadium_id | core 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.
| Page | Free plugin | With PRO |
|---|---|---|
| Match | goals, penalty_shootout, missed_penalties, lineups, substitutes, missing, referees, video, cards, stats, summary, gallery, latest | timeline, goals, penalty_shootout, missed_penalties, formation, lineups, substitutes, missing, referees, video, cards, stats, player-stats, summary, gallery, latest, h2h, commentary, custom-code |
| Club | header, description, fixtures, latest, squad, gallery | header, description, game-stats, fixtures, latest, squad, stats, gallery, transfersNational teams and other “summary” clubs get the free list instead. |
| Player | header, description, stats, matches, missed, gallery | header, stats_panel, description, stats, matches, missed, gallery |
| Referee | header, fixtures, finished, description | |
| Staff | header, description, history | |
| Stadium | header, 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.
| Hook | Kind | What it does | Fired at |
|---|---|---|---|
anwpfl/template/loading_check | filter | Array 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_template | filter | (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_template | action | (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.
| Hook | Kind | Arguments | Fired at |
|---|---|---|---|
anwpfl/tmpl-match/render_header | filter | bool $render, WP_Post $game_post | core templates/content-match.php:51, premium :91 |
anwpfl/tmpl-match/after_header | action | WP_Post $game_post, array $game_data | core templates/content-match.php:55, premium :103 |
anwpfl/match/match-header-bottom | action | int $match_id, array $data | core templates/match/match.php:264, premium :282 |
anwpfl/tmpl-match/lineups_after_header | action | array $data | core templates/match/match-lineups.php:107, premium :121 |
anwpfl/tmpl-club/fields_top | action | WP_Post $club, array $data | core templates/club/club-header.php:77, premium :93 |
anwpfl/tmpl-club/fields_bottom | action | WP_Post $club, array $data | core templates/club/club-header.php:234, premium :250 |
anwpfl/tmpl-stadium/fields_top | action | WP_Post $stadium | core templates/stadium/stadium-header.php:54 |
anwpfl/tmpl-stadium/fields_bottom | action | WP_Post $stadium | core templates/stadium/stadium-header.php:187 |
anwpfl/tmpl-competition/after_group_standing | action | object $group, object $competition, int $competition_post_id | core 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.
| Page | Hooks | Argument passed |
|---|---|---|
| Match | anwpfl/tmpl-match/after_wrapper only | WP_Post |
| Club | anwpfl/tmpl-club/before_wrapper, after_wrapper | WP_Post |
| Stadium | anwpfl/tmpl-stadium/after_wrapper only | WP_Post |
| Player | anwpfl/tmpl-player/before_wrapper, after_wrapper | int post ID |
| Competition | anwpfl/tmpl-competition/before_wrapper, after_wrapper | int post ID |
| Referee | anwpfl/tmpl-referee/before_wrapper, after_wrapper | int post ID |
| Staff | anwpfl/tmpl-staff/before_wrapper, after_wrapper | int post ID |
| Standing | anwpfl/tmpl-standing/before_wrapper, after_wrapper | int 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
| Filter | Arguments | Fired at |
|---|---|---|
anwpfl/tmpl-club/data_fields | array $data, WP_Post $club | core 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_prepared | array $competitions, int $competition_post_id, bool $is_multistage, array $matches | core 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
| Filter | What it controls | Fired at |
|---|---|---|
anwpfl/player/use_short_name | Whether 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_abbr | Whether club abbreviations are used where a short name is needed. Default true. | core includes/class-anwpfl-club.php:2296, :2352 |
anwpfl/config/countries | The country list used by every country selector and flag. | core includes/class-anwpfl-data.php:724 |
anwpfl/config/positions | Active 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_statuses | The special status list – PST, TBD, CANC by default. | core includes/class-anwpfl-data.php:1371 |
anwpfl/assets/load_legacy_bootstrap | Whether the legacy Bootstrap stylesheet is enqueued. | core includes/class-anwpfl-assets.php:228 |
anwpfl/assets/load_legacy_grid | Whether 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
| Action | Arguments | Covers | Fired at |
|---|---|---|---|
anwpfl/match/on_save | array $data, array $post_data | Admin game editor only. | core includes/class-anwpfl-match.php:1069 |
anwpfl/match/inserted | int $match_id, array $data | Every path that creates a game – admin, CSV import, API import, Import Matches. | core includes/class-anwpfl-match.php:1586 |
anwp_fl_edit_post | int $post_id, WP_Post $post | Front-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_save | int $post_id, array $_POST | Club saved in the admin. | core includes/class-anwpfl-club.php:1040 |
anwpfl/player/on_save | int $post_id, array $_POST | Player saved in the admin. | core includes/class-anwpfl-player.php:675 |
anwpfl/standing/on_save | array $data, int $post_id | Standing 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
| Filter | What it does | Fired at |
|---|---|---|
anwpfl/cache/is_active | Master 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_map | array $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_keys | Array 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:
| Priority | Location |
|---|---|
| 1 | Child theme anwp-football-leagues/ |
| 10 | Parent theme anwp-football-leagues/ |
| 50 | Football Leagues PRO templates/ |
| 100 | Football 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.
| Hook | Kind | What it does | Line |
|---|---|---|---|
anwpfl/tmpl-competition/before_header | action | Before the competition header block. | 67 |
anwpfl/tmpl-competition/render_header | filter | Skip the competition header. | 76 |
anwpfl/tmpl-competition/after_header | action | After the competition header block. | 95 |
anwpfl/tmpl-competition/before_stage | action | Before each stage of a multi-stage competition. | 111 |
anwpfl/tmpl-competition/render_stage_title | filter | Skip a stage title. | 122 |
anwpfl/tmpl-competition/after_stage_title | action | After a stage title. | 148 |
anwpfl/tmpl-competition/before_round | action | Before each knockout round. | 203 |
anwpfl/tmpl-competition/render_round_title | filter | Skip a round title. | 217 |
anwpfl/tmpl-competition/before_group | action | Before each group. | 248 |
anwpfl/tmpl-competition/before_group_title | action | Before a group title. | 263 |
anwpfl/tmpl-competition/render_group_title | filter | Skip a group title. | 277 |
anwpfl/tmpl-competition/after_group_title | action | After a group title. | 302 |
anwpfl/tmpl-competition/render_group_standing | filter | Skip a group’s standing table. | 314 |
anwpfl/tmpl-competition/render_list_of_matches | filter | Skip the match list. | 353 |
anwpfl/tmpl-competition/after_list_of_matches | action | After the match list. | 396 |
Club page blocks
| Hook | Kind | What it does | Fired at |
|---|---|---|---|
anwpfl/tmpl-club/before_header | action | Before the club header. | core club/club-header.php:55, premium :66 |
anwpfl/tmpl-club/before_fixtures | action | Before the fixtures block. | core club/club-fixtures.php:40, premium :39 |
anwpfl/tmpl-club/render_fixtures | filter | Skip the fixtures block. | core club/club-fixtures.php:51, premium :50 |
anwpfl/tmpl-club/fixtures_limit | filter | How many fixtures the block shows. Default 10. | core club/club-fixtures.php:80, premium :74 |
anwpfl/tmpl-club/before_latest | action | Before the latest-results block. | core club/club-latest.php:40, premium :40 |
anwpfl/tmpl-club/render_latest | filter | Skip the latest-results block. | core club/club-latest.php:42, premium :42 |
anwpfl/tmpl-club/before_squad | action | Before the squad block. | core club/club-squad.php:39, premium :39 |
anwpfl/tmpl-club/render_squad | filter | Skip the squad block. | core club/club-squad.php:50, premium :50 |
anwpfl/tmpl-club/squad_layout | filter | Override the squad layout for this club. | core club/club-squad.php:66, premium :66 |
anwpfl/tmpl-club/after_squad | action | After the squad block. PRO only. | premium club/club-squad.php:89 |
anwpfl/tmpl-club/before_stats | action | Before the club statistics block. PRO only. | premium club/club-stats.php:70 |
anwpfl/tmpl-club/before_gallery | action | Before the gallery block. | core club/club-gallery.php:54 |
Match sections and match cards
| Hook | Kind | What it does | Fired at |
|---|---|---|---|
anwpfl/tmpl-match/goals_before | action | Before the goals section. | core match/match-goals.php:61 |
anwpfl/tmpl-match/cards_before | action | Before the cards section. | core match/match-cards.php:51 |
anwpfl/tmpl-match/substitutes_before | action | Before the substitutes section. | core match/match-substitutes.php:47 |
anwpfl/tmpl-match/referees_before | action | Before the referees section. | core match/match-referees.php:55 |
anwpfl/tmpl-match/summary_before | action | Before the summary section. | core match/match-summary.php:39 |
anwpfl/tmpl-match/video_before | action | Before the video section. | core match/match-video.php:41 |
anwpfl/tmpl-match/lineups_before | action | Before the lineups section. | core match/match-lineups.php:81, premium :96 |
anwpfl/tmpl-match/stats_before | action | Before the statistics section. | core match/match-stats.php:75, premium :66 |
anwpfl/tmpl-match/h2h_before | action | Before the head-to-head section. PRO only. | premium match/match-h2h.php:39 |
anwpfl/tmpl-match-slim/extra_action | filter | HTML in the action slot of a slim match card. | core match/match--slim-footer.php:79 |
anwpfl/tmpl-match-slim/bottom | action | Bottom line of a slim match card. | core match/match--slim-footer.php:87 |
anwpfl/tmpl-match-small/extra_action | filter | HTML in the action slot of a small match card. | core match/match--small.php:78, premium :96 |
anwpfl/tmpl-match-small/bottom | action | Bottom line of a small match card. | core match/match--small.php:283, premium :301 |
Player, referee and staff headers
| Hook | Kind | What it does | Fired at |
|---|---|---|---|
anwpfl/tmpl-player/before_header | action | Before the player header. | core player/player-header.php:69, premium :75 and player-header--compact.php:68 |
anwpfl/tmpl-player/before_gallery | action | Before the player gallery. | core player/player-gallery.php:47 |
anwpfl/tmpl-player/render_main_photo_caption | filter | Whether 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.
| Hook | Kind | What it does | Fired at |
|---|---|---|---|
anwpfl/standing/row_template | filter | Pre-declare extra counters on every empty standing row before matches are counted. | core includes/class-anwpfl-standing.php:1288 |
anwpfl/standing/accumulate_match_stats | action | Fires 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_table | filter | Fires after ordering and place assignment, for columns that need the finished table. | core includes/class-anwpfl-standing.php:1714 |
anwpfl/standing/derived_columns | filter | Display-ready extra column values, per row. Since 0.18.5. | core includes/class-anwpfl-standing.php:387 |
anwpfl/standing/column_headers | filter | Header 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_calculation | filter | Return true to replace the built-in sort engine. | core includes/class-anwpfl-standing.php:1589 |
anwpfl/standing/custom_position_calculation_table | filter | Your sorted table, used only when the filter above returned true. | core includes/class-anwpfl-standing.php:1600 |
anwpfl/tmpl-standing/columns_order | filter | Which columns render, in order. | core templates/shortcode-standing.php:81 (and the mini, PRO and inner standing templates) |
anwpfl/tmpl-standing/columns_pinned | filter | Columns 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
| Hook | Kind | What it does | Fired at |
|---|---|---|---|
anwpfl/config/permalinks | filter | The CPT slug map used to build plugin permalinks. | core includes/class-anwpfl-options.php:386 |
anwpfl/config/load_plyr | filter | Whether the Plyr video player is registered. Default true. | core includes/class-anwpfl-assets.php:380 |
anwpfl/rest/check_permissions | filter | The permission verdict for plugin REST routes, with $context, $post_id and $post_type. | core includes/class-anwpfl-helper.php:2488 |
anwpfl/thumbnail/look_for_everywhere | filter | Return 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_access | filter | Whether plugin post types stay locked to manage_options. Default true. Note the unusual prefix. | core includes/class-anwpfl-player.php:92 |
anwpfl/template/debug_enabled | filter | Turn on the per-template profiler without defining a constant. | core includes/class-anwpfl-template.php:220 |
anwpfl/template/debug_min_queries | filter | Query-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
- Layout Builder Block Filter – the extension seam for Layout Builder v2 blocks.
- Migration: v0.18.0 – clubs, standings and competitions moved to custom tables. Read this before writing code that reads plugin data.
- Migration: v0.18.2 – the settings merge and the new display option storage.
- REST API reference – read plugin data over HTTP instead of hooking PHP.
- Layout Builder – the no-code way to reorder and drop blocks on an entity page.