WordPress.org

Ready to get started?Download WordPress

Forums

[resolved] Writing $wp_rewrite->non_wp_rules to .htaccess? (13 posts)

  1. tunamaxx
    Member
    Posted 4 years ago #

    I've been plodding my way through creating a custom 'non_wp_rules' for the past day or so. Obviously, http://codex.wordpress.org/Function_Reference/WP_Rewrite has been a huge help.

    I am able to to get the rewrite working as intended, but only by going to options-permalink.php and manually saving out the Permalinks options. At that point, my .htaccess file is updated, including my rule right after RewriteBase and before the first RewriteCond:

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
     RewriteEngine On
     RewriteBase /
     RewriteRule ^find/(this)$ /addit.php?here=$1 [QSA,L]
     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d
     RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress

    My question is how do I mimic the manual save step at options-permalink.php when saving my theme options to enable / disable the non-WordPress rewrite?

    Here is my code in my theme's functions.php:

    function ftc_flush_rewrites() {
     global $wp_rewrite;
     $wp_rewrite->flush_rules();
    }
    
    function ftc_add_rewrites() {
     global $wp_rewrite;
     $ftc_new_non_wp_rules = array(
    	'find/(this)' => '/addit.php?here=$1',
     );
    
     $wp_rewrite->non_wp_rules = $ftc_new_non_wp_rules + $wp_rewrite->non_wp_rules;
    }
    
    add_action('init', 'ftc_flush_rewrites');
    add_action('generate_rewrite_rules', 'ftc_add_rewrites');

    I understand that the $wp_rewrite->flush_rules(); in my ftc_flush_rewrites function is supposed to write to the .htaccess file with the implied 'hard' flush, but why is it not actually being written until I force it by a manual save at options-permalink.php?

    Sorry this is such a long post! Just trying to be thorough. ;)

  2. tunamaxx
    Member
    Posted 4 years ago #

    I wonder if I should take the rewrite functionality out of the theme and build it ito an acompanying plugin? I'd prefer to keep it all in the theme though...

  3. tunamaxx
    Member
    Posted 4 years ago #

    Testing... is this thing on? ;)

  4. Konstantin Kovshenin
    Member
    Posted 4 years ago #

    Hi TunaMaxx, have you been able to solve the problem? I've got a similar issue, really don't wanna dig into the admin panel code to see what happens..

  5. tunamaxx
    Member
    Posted 4 years ago #

    No, unfortunately I have not been able to solve it. I did dig into the code a little bit, and from what I can figure out, the key is in the:

    $wp_rewrite->flush_rules()

    It is supposed to write out the changes to .htaccess if the first arg is NOT set to false.

  6. tunamaxx
    Member
    Posted 4 years ago #

    Hmm... can't edit my own post to add this, so I thought I'd point out some interesting links. I still haven't found a solution, but these have shed some light:

    Adding rewrite rules and $wp_rewrite->flush_rules():
    http://wordpress.org/support/topic/313946?replies=7
    "This is a bug in the way we store rewrite_rules in "transients"
    instead of options like we used to. I think our fix for WP 2.9 is
    going to be to revert to the old method.
    
    http://core.trac.wordpress.org/ticket/10981"
    Correct usage of add_rewrite in plugin:
    http://wordpress.org/support/topic/226529?replies=3
    "Second, the problem is that add_rewrite_rule needs to come before
    you flush the rules. I know it seems unintuitive, but what happens
    when you flush the rules is that they're immediately regenerated,
    at which point WordPress says, "hmm, what rewrite rules do I need
    to include?"
  7. Konstantin Kovshenin
    Member
    Posted 4 years ago #

    I found something more.. flush_rules has $hard = true by default, that means that it is supposed to write to .htaccess, but it doesn't because the save_mod_rewrite_rules function doesn't exist at that moment. I tried including both wp-admin/includes/misc.php and wp-admin/includes/file.php and it seems to be trying to write something, but with no success :( heh.. Let me know if you get to something ..

  8. Konstantin Kovshenin
    Member
    Posted 4 years ago #

    TunaMaxx, I think I just found a solution ... Give me a sec, lemme wrap it up in a post.

  9. Konstantin Kovshenin
    Member
    Posted 4 years ago #

    Ah, nevermind. Didn't catch the theme options part. I had to rebuild my .htaccess whenever a page or post is published and flush_rules(true) works fine in publish_post hook ...

  10. tunamaxx
    Member
    Posted 4 years ago #

    I'm still scouring code and support forums looking for a solution. Between the two of us, we might just come up with something!

  11. tunamaxx
    Member
    Posted 4 years ago #

    I have been tearing my hair out on this. Is there anyone that can offer assistance? PLEASE?

  12. tunamaxx
    Member
    Posted 4 years ago #

    Success! So simple once you catch on...

    The all important $wp_rewrite->flush_rules() can only be called from the Admin side. Makes sense, right? You wouldn't want to be calling it every single page load.

    This whole time, my code has been pretty much correct except for where I was calling the flush. Since it needs to be called from the Admin side, the hook is 'admin_init':

    add_action('admin_init', 'ftc_flush_rewrites');

    Here is the complete functioning sample code:

    function ftc_flush_rewrites() {
     global $wp_rewrite;
     $wp_rewrite->flush_rules();
    }
    
    function ftc_add_rewrites() {
     global $wp_rewrite;
     $ftc_new_non_wp_rules = array(
    	'find/(this)' => '/addit.php?here=$1',
     );
    
     $wp_rewrite->non_wp_rules = $ftc_new_non_wp_rules + $wp_rewrite->non_wp_rules;
    }
    
    add_action('generate_rewrite_rules', 'ftc_add_rewrites');
    add_action('admin_init', 'ftc_flush_rewrites');
  13. carlla
    Member
    Posted 3 years ago #

    Thanks for share =D That worked fine for me!

Topic Closed

This topic has been closed to new replies.

About this Topic