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.
Web DevelopmentPHPWordPress

Avatar of undefined
Last Comment
Scott Fell

8/22/2022 - Mon
Julian Hansen

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

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

Julian Hansen

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.
This is the best money I have ever spent. I cannot not tell you how many times these folks have saved my bacon. I learn so much from the contributors.
rwheeler23
ASKER
Scott Fell

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.
ASKER
Scott Fell

The URL will look like mysite.com/custompage/abc/123xyz And I need to extract the two parameters abc and 123xyz
ASKER CERTIFIED SOLUTION
gr8gonzo

Log in or sign up to see answer
Become an EE member today7-DAY FREE TRIAL
Members can start a 7-Day Free trial then enjoy unlimited access to the platform
Sign up - Free for 7 days
or
Learn why we charge membership fees
We get it - no one likes a content blocker. Take one extra minute and find out why we block content.
See how we're fighting big data
Not exactly the question you had in mind?
Sign up for an EE membership and get your own personalized solution. With an EE membership, you can ask unlimited troubleshooting, research, or opinion questions.
ask a question
ASKER
Scott Fell

Perfect solution!
Get an unlimited membership to EE for less than $4 a week.
Unlimited question asking, solutions, articles and more.
ASKER
Scott Fell

Thank you!  This is what I used.