How to debug removal of rewrite rule flushing?

To see if the option 'rewrite_rules' was reset – that’s what flush_rewrite_rules() does internally – hook into the option actions and log what happens.

The following small plugin does that. It will tell you what code flushed the rewrite rules and how the rules looked before and after the flush. If no flush happened it just says nothing logged. 🙂

<?php
/* Plugin Name: Debug rewrite rule flushing */

add_action( 'plugins_loaded', 'wpse_67368_debug_rewrite_flushes' );

function wpse_67368_debug_rewrite_flushes()
{
    static $log = array ();

    if ( 'plugins_loaded' === current_filter() )
    {
        $hooks = array (
            'added_option',
            'updated_option',
            'deleted_option',
            'shutdown'
        );
        foreach ( $hooks as $hook )
        {
            add_action( $hook, __FUNCTION__, 10, 3 );
        }

        return;
    }

    if ( 'shutdown' === current_filter() )
    {
        empty ( $log ) and $log = 'nothing logged';
        printf( '<pre>%s</pre>', var_export( $log, TRUE ) );
        return;
    }

    $args = func_get_args();
    $option = array_shift( $args );

    if ( 'rewrite_rules' === $option )
    {
        $log[] = array (
            'filter'    => current_filter(),
            'option'    => $option,
            'args'      => $args,
            'backtrace' => debug_backtrace()
        );
    }
}

Leave a Comment