How Do I Programmatically Force Custom Permalinks with My Theme?

I’m making a custom theme. It’s a highly specialized theme to make WordPress into like an application rather than a CMS system or blog. For instance, a Dental Office Scheduling System (with CMS and widget capabilities), as an example.

Because my theme needs pretty URLs to work properly, something I really need is for the .htaccess file to be that default that gets created only when someone sets Permalinks to Custom (and then types in something like %postname%). How do I trigger that in WordPress, programmatically, so that it creates this? I mean, I could probably overwrite the file myself during theme activation, but the better thing would be to use the WordPress API for it.

Related posts

Leave a Reply

3 comments

  1. To fully enable permalinks, you also need to ensure that .htaccess is also created. To do that, you need to set an option and flush the rules with a Boolean.

    global $wp_rewrite; 
    
    //Write the rule
    $wp_rewrite->set_permalink_structure('/%postname%/'); 
    
    //Set the option
    update_option( "rewrite_rules", FALSE ); 
    
    //Flush the rules and tell it to write htaccess
    $wp_rewrite->flush_rules( true );
    

    If you use this in a plugin, it needs to be in the init hook, not the load hook. If it’s in the load hook, it will throw an error saying $wp_rewrite is null.

    Important: You should also have a conditional so this is only set once. (You can create an option and check if it’s set, if not then you run this permalink code and set that option)

    I also typically check if it’s the admin side and only run it if it is.

  2. function change_permalinks() {
        global $wp_rewrite;
        $wp_rewrite->set_permalink_structure('/%postname%/');
        $wp_rewrite->flush_rules();
    }
    add_action('init', 'change_permalinks');
    

    You may not need the action hook if you’re sticking this in your theme activation function code.

    I also found that this only slightly worked. You still have to click the Permalinks settings page for that .htaccess file to be created. So, what to do? Well, I found I could use an IFRAME that loads that page automatically for me from my theme’s options panel, and then it would create that .htaccess file for me.

    <iframe style="position:absolute;top:-5000px" src="<?= site_url() ?>/wp-admin/options-permalink.php"></iframe>
    
  3. This is how I use this, to only occur when my theme is activated, and only if there is no pre-existing setting saved (to not break something done before my theme is used).

    /*
     * Set permlinks on theme activate
     */
        function set_custom_permalinks() {
            $current_setting = get_option('permalink_structure');
    
            // Abort if already saved to something else
            if($current_setting) {
                return
            }
    
            // Save permalinks to a custom setting, force create of rules file
            global $wp_rewrite;
            update_option("rewrite_rules", FALSE);
            $wp_rewrite->set_permalink_structure('/news/%postname%/');
            $wp_rewrite->flush_rules(true);
        }
        add_action('after_switch_theme', 'set_custom_permalinks');
    

    The advantage of this is that it will only run once when the theme is activated, not every time WordPress is loaded by a visit to the site.