How to debug removal of rewrite rule flushing?

I use Custom Post Types. I try this:

functions.php

add_action( 'admin_init', 'flush_rewrite_rules' );

Now I’d like to remove this again. I try this:

remove_action( 'admin_init', 'flush_rewrite_rules' );

I’m not sure if it works right. How can I test if the rewrite rules really not flushed anymore?

1 Answer
1

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