Jake Paris

Debugging WordPress Rewrite Rules

If you’ve ever tried to use WordPress’ rewriting functions, let alone debug them, you know pain. The terror that this experience visited on me spurred me to create this drop-in function which prints a list of all the current rewrite rules (in order), and highlights which rule was matched for the current view. You could throw this in your header file.

 function jp_debug_rewrite_rules($where = 'head') {
    // only do this on public side
    if( is_admin() ) return false;

    switch($where) {
        case 'foot' :
            $filter = 'wp_before_admin_bar_render';
            break;
        case 'footer' :
            $filter = 'wp_before_admin_bar_render';
            break;
        default :
            $filter = 'get_header';
            break;
    }

    add_filter($filter,function(){
    global $wp_rewrite, $wp, $template;

    if (!empty($wp_rewrite->rules)) { ?>

        <style>h5{background:#000!important;color:#fff!important;padding:1em!important;margin:1em!important}table{margin:1em!important}table td{border:1px solid silver;padding:5px}tr.matchedrule td{border-color:transparent}tr.matchedrule>td{background:HSLA(52,96%,67%,1)}tr.matchedrule+tr.matchedrule>td{background:HSLA(52,96%,67%,.5)}tr.matchedrule table td+td{font-weight:700}</style>

        <h5>Rewrite Rules</h5>
        <table>
            <thead>
                <tr>
                    <td>
                    <td>Rule
                    <td>Rewrite
                </tr>
            </thead>
            <tbody>
        <?php
        $i = 1;
        foreach ($wp_rewrite->rules as $name => $value) {
            if( $name == $wp->matched_rule ) {

                echo '<tr class="matchedrule">
                    <td>' . $i . '
                    <td>'.$name.'
                    <td>' . $value . '
                    </tr>
                    <tr class="matchedrule">
                    <td colspan="3">
                        <table>
                            <tr><td>Request
                                <td>' . $wp->request . '
                            <tr><td>Matched Rewrite Query
                                <td title="'.urldecode($wp->matched_query).'">' . $wp->matched_query . '
                            <tr><td>Loaded template
                                <td>'. basename($template) . '
                        </table>
                    </td>
                    </tr>';

            } else {
                echo '<tr>
                    <td>'.$i.'
                    <td>'.$name.'
                    <td>'.$value.'
                  </tr>';
            }
            $i++;
        }
        ?>
            </tbody>
        </table>

    <?php

    }
    });
}

Don’t forget to call it after or nothing will happen!

jake_debug_rewrite_rules();

Image Credit: http://www.susangainenartist.com/blog/2014/10/13/new-series-friendship-complicated-messy-beautiful-lucky/

Leave a Reply