I'm looking to redirect pdfs documents from the uploads folder to WordPress to prevent unauthorized site visitors from viewing them.

I have used the code provided from this thread How to restrict attachment download to a specific user? and it most definitely works. However, in my plugin, I would like to add the rewrite rule using the WordPress's Rewrite API, so the rewrite rule will automatically get added to the .htaccess file either on activation or when the rewrite rules are flushed. I want to avoid manually adding it.

The rewrite rule I am looking to add is ^wp-content/uploads/(.*\.pdf)$ /index.php?get_file=$1.

 * Flushes rewrites if our project rule isn't yet added.
function wpdocs_flush_rules() {
    $rules = get_option( 'rewrite_rules' );

    if ( ! isset( $rules['^wp-content/uploads/(.*\.pdf)$'] ) ) {
        global $wp_rewrite;
        echo 'flushed';
add_action( 'wp_loaded','wpdocs_flush_rules' );

* Adds a new rewrite rule.
* @param array $rules Existing rewrite rules.
* @return array (Maybe) modified list of rewrites.
function wpdocs_insert_rewrite_rules( $rules ) {
    $newrules = array();
    $newrules['wp-content/uploads/(.*\.pdf)$'] = '/index.php?get_file=$1';
    return array_merge( $newrules, $rules);
add_filter( 'rewrite_rules_array','wpdocs_insert_rewrite_rules' );

// Adding the id var so that WP recognizes it
function wpdocs_insert_query_vars( $vars ) {
    array_push( $vars, 'get_file' );
    return $vars;
add_filter( 'query_vars','wpdocs_insert_query_vars' );

I even tried using insert_with_markers and add_rewrite_rule( $regex, $query, 'top' ). In fact, the rewrite rule was written into the WP_Rewrite object correctly, but just not added to the .htaccess file. When I change the $query to not be related to index.php, it gets added no problem to .htaccess, which of course is not what I want. It seems WordPress is preventing certain rules from being added to the actual .htaccess file.

Thanks for your help!

  • That's not how WordPress works. Please check some mod_rewrite solution. rewrite_rules_array works with virtual URLs (like blog posts or categories). – Butuzov Apr 4 '18 at 20:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.