We help IT Professionals succeed at work.

Adding Multiple Custom urls in Wordpress

Scott Fell
Scott Fell asked
on
491 Views
Last Modified: 2018-10-09
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.
Comment
Watch Question

CERTIFIED EXPERT
Most Valuable Expert 2017
Distinguished Expert 2019

Commented:
Question:
1. Why not add this directly to .htaccess?
2. What is the purpose of the query_vars hook?
Scott FellDeveloper
CERTIFIED EXPERT
Fellow
Most Valuable Expert 2013

Author

Commented:
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

CERTIFIED EXPERT
Most Valuable Expert 2017
Distinguished Expert 2019

Commented:
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.
Scott FellDeveloper
CERTIFIED EXPERT
Fellow
Most Valuable Expert 2013

Author

Commented:
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.
Scott FellDeveloper
CERTIFIED EXPERT
Fellow
Most Valuable Expert 2013

Author

Commented:
The URL will look like mysite.com/custompage/abc/123xyz And I need to extract the two parameters abc and 123xyz
Consultant
CERTIFIED EXPERT
Commented:
This one is on us!
(Get your first solution completely free - no credit card required)
UNLOCK SOLUTION
Scott FellDeveloper
CERTIFIED EXPERT
Fellow
Most Valuable Expert 2013

Author

Commented:
Perfect solution!
Scott FellDeveloper
CERTIFIED EXPERT
Fellow
Most Valuable Expert 2013

Author

Commented:
Thank you!  This is what I used.
Unlock the solution to this question.
Join our community and discover your potential

Experts Exchange is the only place where you can interact directly with leading experts in the technology field. Become a member today and access the collective knowledge of thousands of technology experts.

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.