Link to home
Start Free TrialLog in
Avatar of Scott Fell
Scott FellFlag for United States of America

asked on

Adding Multiple Custom urls in Wordpress

Currently the way I am adding custom urls in wordpress is

functions.php
function custom_rewrite_rule() {

    add_rewrite_rule('^custompage/([^/]*)/([^/]*)/?','index.php?page_id=1933&param1=$matches[1]&param2=$matches[2]','top');

}
add_action('init', 'custom_rewrite_rule', 10, 0);
add_filter('query_vars', function($vars) {
    $vars[] = "param1";
    $vars[] = "param2";
    return $vars;
});

Open in new window


If I want to have multiple custom urls, I find I have to do the same thing twice like
functions.php
function custom_rewrite_rule() {

    add_rewrite_rule('^custompage/([^/]*)/([^/]*)/?','index.php?page_id=1933&param1=$matches[1]&param2=$matches[2]','top');

}
add_action('init', 'custom_rewrite_rule', 10, 0);
add_filter('query_vars', function($vars) {
    $vars[] = "param1";
    $vars[] = "param2";
    return $vars;
});
// short code to generate data for mysite.com/custompage/


function custom_rewrite_rule_two() {

    add_rewrite_rule('^new_custompage/([^/]*)/?','index.php?page_id=2034&param1=$matches[1]','top');

}
add_action('init', 'custom_rewrite_rule_two', 10, 0);
add_filter('query_vars', function($vars) {
    $vars[] = "param1";
    return $vars;
});

// short code to generate data for mysite.com/new_custompage/

Open in new window


That works, how can I do this in just one function for adding custom urls

function custom_rewrite_rule() {

    add_rewrite_rule('^custompage/([^/]*)/([^/]*)/?','index.php?page_id=1933&param1=$matches[1]&param2=$matches[2]','top');
    add_rewrite_rule('^new_custompage/([^/]*)/?','index.php?page_id=2034&param3=$matches[3]','top');

}
add_action('init', 'custom_rewrite_rule', 10, 0);
add_filter('query_vars', function($vars) {
    $vars[] = "param1";
    $vars[] = "param2";
    $vars[] = "param3";
    return $vars;
});

Open in new window


I have tried different combinations and can't seem to make this fully functional.
Avatar of Julian Hansen
Julian Hansen
Flag of South Africa image

Question:
1. Why not add this directly to .htaccess?
2. What is the purpose of the query_vars hook?
Avatar of Scott Fell

ASKER

Julian,

I have to integrate dynamic data/html into an already established theme where the dynamic data is coming from a data source not associated with the WP DB.  

What I am doing is creating a page in the current theme and throwing in a shortcode in the body. In WP, I have a page called custompage that contains the shortcode.  Using mysite.com/custompage/param1/param2 I am using the two parameters to filter data.

The shortcode function is
add_shortcode( 'short_code', 'short_code_func' );
short_code_func{

   $param1= get_query_var( 'param1' );
   $param2= get_query_var( 'param2' );

   return $param1.' '.$param2;

}

add_shortcode( 'other_short_code', 'other_short_code_func' );
other_short_code_func{

   $param3= get_query_var( 'param3' );
  
  return $param3;
}

Open in new window

Ok, but I am confused as to how that is tying into the add_rewrite_rule()

I had no problem with this

function custom_rewrite_rule() {
	add_rewrite_rule('^abc/([0-9]+)/?', 'index.php?page_id=$matches[1]', 'top');
	add_rewrite_rule('^def/([0-9]+)/?', 'index.php?page_id=$matches[1]', 'top');
}
add_action('init', 'custom_rewrite_rule', 10, 0);

Open in new window

However, I did have to go to settings => permalinks [SAVE] before the above would work.
Yes, every time you make an update to the rewrite rule you need to save the permalinks which runs flush_rewrite_rules();.

The issue I am having that I did not make clear is getting the parameters.

If I have
function custom_rewrite_rule() {

    add_rewrite_rule('^custompage/([^/]*)/([^/]*)/?','index.php?page_id=1933&param1=$matches[1]&param2=$matches[2]','top');
    add_rewrite_rule('^new_custompage/([^/]*)/?','index.php?page_id=2034&param3=$matches[3]','top');

}
add_action('init', 'custom_rewrite_rule', 10, 0);
add_filter('query_vars', function($vars) {
    $vars[] = "param1";
    $vars[] = "param2";
    $vars[] = "param3";
    return $vars;
});

Open in new window


Then on the shortcode function for each of custompage and new_custompage, accessing the parameters is where I am having trouble. If I run as separate functions it works, but it seems all of these can be in one function.  Actually the first rule for custompage I can access param1 and param2. But it does not work for new_custompage. The parameter is null.

I have also tried
add_rewrite_rule('^custompage/([^/]*)/([^/]*)/?','index.php?page_id=1933&param1=$matches[1]&param2=$matches[2]','top');
    add_rewrite_rule('^new_custompage/([^/]*)/?','index.php?page_id=2034&param3=$matches[1]','top');

Open in new window


Note that I am using index.php?page_id=1933 as the filter so each is specific to a page.
The URL will look like mysite.com/custompage/abc/123xyz And I need to extract the two parameters abc and 123xyz
ASKER CERTIFIED SOLUTION
Avatar of gr8gonzo
gr8gonzo
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Perfect solution!
Thank you!  This is what I used.