Files
CWC/bin/check-affected-pages.php
T
Keith Solomon 23ef7388eb tooling(test): add pre-flight script for hero gate rollout
Lists every published page on the site that has hero_style = 'default' and
is not a Services descendant. Those are the pages whose visible hero
behavior changes when isServicesDescendant() is enabled.

Runs from the WordPress root via:

    php bin/check-affected-pages.php

The script bootstraps wp-load.php, queries WP_Query for all 'page'
posts, filters by the ACF 'hero_style' meta, then defers the ancestor
check to CWC\isServicesDescendant() (the same helper the gate uses) so
the output matches runtime behavior. Operator should run this before
enabling the gate on a real site.
2026-07-04 16:17:33 -05:00

154 lines
3.9 KiB
PHP

<?php
/**
* Pre-flight check: list pages on this site that have
* `hero_style = 'default'` but are NOT Services descendants.
*
* These are the pages whose visible hero behavior changes when the
* Services-descendant gate is introduced in `isServicesDescendant()`
* (see `lib/extras.php`).
*
* Run from the WordPress root:
*
* php bin/check-affected-pages.php
*
* Or, if the WordPress install is at a different path, point
* `wp-load.php` resolution accordingly (see the bootstrap below).
*
* @package CWC
*/
if ( ! defined( 'ABSPATH' ) ) {
// We are not inside WordPress. Try to bootstrap from the WordPress root.
// This script lives at wp-content/themes/<theme>/bin/, so the WordPress
// root (which contains wp-load.php) is four levels up.
$wp_load = dirname( __DIR__, 4 ) . '/wp-load.php';
if ( ! file_exists( $wp_load ) ) {
fwrite( STDERR, "Could not locate wp-load.php at {$wp_load}. Run this script from the WordPress root or set up ABSPATH first.\n" );
exit( 1 );
}
require_once $wp_load;
}
if ( ! function_exists( 'get_field' ) ) {
fwrite( STDERR, "ACF is not active; this script needs Advanced Custom Fields to read `hero_style`.\n" );
exit( 1 );
}
if ( ! function_exists( 'CWC\\isServicesDescendant' ) ) {
fwrite( STDERR, "CWC\\isServicesDescendant() is not loaded. Make sure the active theme is community-works-collaborative.\n" );
exit( 1 );
}
/**
* Query every published page and check whether its hero would be affected.
*/
function cwc_check_affected_pages() {
$query = new WP_Query(
array(
'post_type' => 'page',
'post_status' => 'publish',
'posts_per_page' => -1,
'orderby' => 'menu_order title',
'order' => 'ASC',
'no_found_rows' => true,
)
);
$affected = array();
$skipped_due_to_error = 0;
while ( $query->have_posts() ) {
$query->the_post();
$post = get_post();
$hero_style = get_field( 'hero_style', $post->ID );
if ( 'default' !== $hero_style ) {
continue;
}
$is_services_descendant = \CWC\isServicesDescendant( $post );
if ( is_wp_error( $is_services_descendant ) ) {
++$skipped_due_to_error;
continue;
}
if ( $is_services_descendant ) {
continue;
}
$affected[] = array(
'ID' => (int) $post->ID,
'title' => get_the_title( $post ),
'url' => get_permalink( $post ),
'slug' => $post->post_name,
);
}
wp_reset_postdata();
return array(
'affected' => $affected,
'skipped_due_to_error' => $skipped_due_to_error,
);
}
$result = cwc_check_affected_pages();
$affected = $result['affected'];
echo "Pages with hero_style = 'default' that are NOT Services descendants\n";
echo "==================================================================\n\n";
if ( empty( $affected ) ) {
echo "None. Every page that uses the default hero is a Services descendant (or the Services page itself).\n";
} else {
printf( "Found %d affected page(s):\n\n", count( $affected ) );
$rows = array();
$rows[] = array( 'ID', 'Slug', 'Title', 'URL' );
foreach ( $affected as $page ) {
$rows[] = array(
(string) $page['ID'],
$page['slug'],
$page['title'],
$page['url'],
);
}
// Compute column widths for aligned output.
$widths = array();
foreach ( array( 0, 1, 2, 3 ) as $col ) {
$widths[ $col ] = 0;
foreach ( $rows as $row ) {
$widths[ $col ] = max( $widths[ $col ], strlen( $row[ $col ] ) );
}
}
$format = '| %-' . $widths[0] . 's | %-' . $widths[1] . 's | %-' . $widths[2] . 's | %-' . $widths[3] . "s |\n";
$separator = '+';
foreach ( $widths as $w ) {
$separator .= str_repeat( '-', $w + 2 ) . '+';
}
$separator .= "\n";
echo $separator;
foreach ( $rows as $i => $row ) {
printf( $format, ...$row );
if ( 0 === $i ) {
echo $separator;
}
}
echo $separator;
}
if ( $result['skipped_due_to_error'] > 0 ) {
printf(
"\nWarning: %d page(s) could not be evaluated due to errors. Re-run with WP_DEBUG enabled for details.\n",
$result['skipped_due_to_error']
);
}
echo "\n";