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.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 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.
Method 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>
Method 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.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0