[ create a new paste ] login | about

Link: http://codepad.org/SVQpaw6l    [ raw code | fork ]

k4st - PHP, pasted on May 27:
<?php

// yikes!
!defined('WP_MAIN_DIR') && 
    define('WP_MAIN_DIR', dirname(dirname(dirname(dirname(__FILE__)))));

/**
 * Piggyback a rule into the WP_Rewrite class, even if it doesn't exist in the
 * database (yet). Note: do not anchor regular expression rules to the start of
 * a subject. Anchor them to the end of one, ie: regex here $. Do not put any
 * delimiters or modifiers in the regular expression. When accessing subpattern
 * matches in $location, use: $matches[x] where 'x' is the numbered subpattern.
 * The first subpattern can be referenced by $matches[1].
 * @author Peter Goodman
 */
function piggyback_rewrite_rule($regex = '', $location = '') {
    static $rules = array();
    
    if(!empty($regex)) {
        $rules[$regex] = $location;
        return;
    }
    
    return $rules;
}

/**
 * Add in the piggybacked rules.
 * @author Peter Goodman
 * @internal
 */
function piggyback_rewrite_rules() {
    global $wp_rewrite;
        
    // this has likely been cached already
    $rules =& get_option('rewrite_rules');
    $changed = FALSE;   
    $force = TRUE;
    
    // go over the piggybacked rules and add them in if necessary
    foreach(piggyback_rewrite_rule() as $regex => $location) {
    
        // make sure it gets into the database
        if(!isset($rules[$regex]) || $force) {
            $rules[$regex] = $location;
            $changed = TRUE;
        }
    
        // make sure it shows up in the class as well, this is less important
        // we put it into the extra_rules as well to make sure it will live on
        // if we rewrite the rules.
        $wp_rewrite->rules[$regex] = $location;
        $wp_rewrite->extra_rules[$regex] = $location;
    }
        
    // update the db options
    if($changed || $force) {

        // discard any changed (and no longer useful) rules that no longer
        // need to be in the database
        $wp_rewrite->rewrite_rules();
        krsort($wp_rewrite->rules);
        update_option('rewrite_rules', $wp_rewrite->rules);
        
        // if .htaccess doesn't exist for some reason, create it.
        $htaccess = WP_MAIN_DIR .'/.htaccess';
        if(!file_exists($htaccess))
            piggyback_force_rewrite($htaccess);
    }
    
    //print_r($rules);
    //exit;
}

/**
 * Force a rewrite of the .htaccess file if it doesn't yet exist.
 */
function piggyback_force_rewrite($htaccess_file) {
    global $wp_rewrite;
    
    $rules = $wp_rewrite->mod_rewrite_rules();
    $fp = fopen($htaccess_file, "w");
    
    // write the rules to the .htaccess
    if(is_resource($fp)) {
        fwrite($fp, $rules);
        fclose($fp);
    }
}

/**
 * Helper function for doing feeds.
 */
function rewrite_feed($extra = '') {
    return 'index.php?&feed=$matches[1]' . $extra;
}

// could use add_action, but it just calls add_filter and so we will ignore
// the distinction. The priority is 1 so that it is executed *before* the
// redirect_canonical() function
add_filter('template_redirect', 'piggyback_rewrite_rules', 1);


Create a new paste based on this one


Comments: