diff --git a/bin/check-affected-pages.php b/bin/check-affected-pages.php new file mode 100644 index 0000000..c5b48a2 --- /dev/null +++ b/bin/check-affected-pages.php @@ -0,0 +1,153 @@ +/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";