I used to have this structure of URL when user apply for offer on website:
/apply/?apply=8282
What I'm trying to do now, is to make it look like
/apply/8282
I did some research and come up with this 2 simple functions:
function add_custom_query_var( $vars ){
$vars[] = "apply";
return $vars;
}
add_filter( 'query_vars', 'add_custom_query_var' );
function custom_rewrite_basic()
{
add_rewrite_rule('^apply/([0-9]+)/?', 'apply?apply=$1', 'top');
}
add_action('init', 'custom_rewrite_basic');
However i can't get my ID, :
echo "GET APPLY = ".$_GET['apply']."<br />";
How to get 8282 id number?
You could basicly access the id like this:
$id = basename($_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
It will return 8282. Its probably not that clean but its simple and I am using it aswell in a special case.
Related
I am trying to call function, created with add_action using do_action:
In the function.php of the theme:
function bleute_utbi_service_type()
{
return "service";
}
add_action('utbi_service_type', 'bleute_utbi_service_type');
Now, I need to get the value of the function in a plugin file:
// 'x' plugin file:
function get_valor(){
$val = do_action('utbi_service_type');
echo "this is the valor:" . $val";
}
This way of doing is not working, $val return 'null'...why?
Action hooks do not return content, and honestly if you need an action hook to return content there is a pretty good chance that you are doing something wrong.
add_action() takes the identification of a function, in your case
bleute_utbi_service_type(), and puts it into a list of functions to be called
whenever anybody calls do_action().
Either use $params with your do_action and add_action and then set the $value in your add_action callback function or use filters to return contents. To know how return works with filters, u may refer here: Wordpress: How to return value when use add_filter? or https://developer.wordpress.org/reference/functions/add_filter/
If you want to do it with add_action than you have to follow this referenece by passing argument to add_action
Reference
else try using apply filters like this.
add above code in function.php:
function example_callback( $string ) {
return $string;
}
add_filter( 'example_filter', 'example_callback', 10, 1 );
function get_valor(){
$val = apply_filters( 'example_filter', 'filter me' );
echo "this is the valor:". $val;
}
and add below code to wherever you want to print:
get_valor();
hope it works for you :)
I am trying to grab the ID of the current post, so that I can place it correctly within the rewritten URL.
function custom_rewrite_rule() {
global $post;
add_rewrite_tag('%type%', '([^&]+)');
$path = 'index.php?p=' . $post->ID . ''; // This returns NULL so doesn't work.
add_rewrite_rule('^latest/([^/]*)/([^/]*)?', $path, 'top' );
add_rewrite_rule('^latest/([^/]*)/?', 'index.php?page_id=10&type=$matches[1]', 'top' );
}
add_action('init', 'custom_rewrite_rule', 10, 1);
Basically, I have a section, where I list posts called latest, which is then filtered by a 'type' variable (the second param, like 'opinion').
/latest/opinion/ (successfully loads posts tagged as opinion).
/latest/opinion/my-actual-post/ (shows blank page, because $post is NULL)
Any help greatly appreciated!
Perhaps, using the get_page_by_path() Function could do the trick for you.
function custom_rewrite_rule() {
$slug = basename(rtrim($_SERVER["REQUEST_URI"], "/"));
$pagePath = get_page_by_path($slug);
$page_id = $pagePath->ID;
global $post;
add_rewrite_tag('%type%', '([^&]+)');
$path = 'index.php?p=' . $page_id . ''; // This returns NULL so doesn't work.
add_rewrite_rule('^latest/([^/]*)/([^/]*)?', $path, 'top' );
add_rewrite_rule('^latest/([^/]*)/?', 'index.php?page_id=10&type=$matches[1]', 'top' );
}
Okay, I figured it out - hopefully it will help someone else.
You can use the name query var and match that against the last part in the URL, without needing to know the posts ID:
function custom_rewrite_rule() {
add_rewrite_tag('%type%', '([^&]+)');
add_rewrite_tag('%name%', '([^&]+)');
add_rewrite_rule('^latest/([^/]*)/([^/]*)/?', 'index.php?type=$matches[1]&name=$matches[2]', 'top' );
add_rewrite_rule('^latest/([^/]*)/?', 'index.php?page_id=10&type=$matches[1]', 'top' );
}
add_action('init', 'custom_rewrite_rule', 10, 1);
First WP will try to match three parts /latest/opinion/something-else/, if it doesn't have three parts then it will try to match two parts /latest/opinion/.
In the latter case, the page_id is hard coded, but in the first case, we use name=$matches[2] which successfully gets the dynamic post we need, without having to manually fetch any ID.
The reason the latter is hard coded to an ID, it because it is a page that gets all posts tagged with 'opinion' and not an actual post itself.
Is this function called within the loop?
Have you tried: get_the_id();
That should return the current post id. Especially with a global $post. It looks like they are calling:
$post = get_post(); before they attempt to pull $post->ID. My guess is even with a global $post is an empty shell object until you set it. Please let me know if this works on your site, I can adjust if it doesn't - it works fine for me.
I'm adding a query string parameter SpaceID like this
function add_custom_query_var( $vars ) {
$vars[] = "SpaceID";
return $vars;
}
add_filter( 'query_vars', 'add_custom_query_var' );
and the URL is like this:
http://MyHost/MyWebSite/space-details/?SpaceID=327
and getting the parameter like this
get_query_var('SpaceID');
I'm trying to change the URL to be user friendly like this
http://MyHost/MyWebSite/space-details/space-name
I try like this article but is not working.
I have a basic redirection set up:
function example_add_rewrite_rules() {
$made_year = '(\d{4})?';
$make = '([a-z]{1,20})';
$model = '(.+)';
add_rewrite_rule( 'c/'.$made_year.'/?'.$make.'/'.$model.'/?$', 'index.php?page_id=46&made_year=$matches[1]&make=$matches[2]&model=$matches[3]', 'top' );
}
add_action( 'init', 'example_add_rewrite_rules' );
My hope is that whenever the user hits the page with a URL of ../c/2015/ford/f150, that URL is stored in a query string.
So, hopefully, the user will see this: "/c/2015/ford/f150"
While I see this: "?page_id=46&year=2015&make=ford&model=f150"
I cant tell if its working or not though. If I type in /c/2015/ford/f150 it will redirect me to the correct page/page_id. But I cant figure out for the life of me how to print those query variables to the page so I can at least see that the query string is configured correctly and has variables stored in year, make, and model.
Summary: Have I done anything wrong in the code above? If not, how do I print the query string variables to the page?
Aside: I'm jumping into an ocean of PHP and I'm still trying to learn how to swim. If I misstated something, forgive and correct me, for I know not what I do.
To use your own query vars within rewrite rules, you need to add them to the list of known vars:
function wpd_query_vars( $qvars ) {
$qvars[] = 'my_year';
$qvars[] = 'make';
$qvars[] = 'model';
return $qvars;
}
add_filter( 'query_vars', 'wpd_query_vars' , 10, 1 );
Then you can output their values in the template with get_query_var:
echo get_query_var( 'model' );
I am having trouble trying to pass an extra variable in the url to my WordPress installation.
For example /news?c=123
For some reason, it works only on the website root www.example.com?c=123 but it does not work if the url contains any more information www.example.com/news?c=123. I have the following code in my functions.php file in the theme directory.
if (isset($_GET['c']))
{
setcookie("cCookie", $_GET['c']);
}
if (isset($_SERVER['HTTP_REFERER']))
{
setcookie("rCookie", $_SERVER['HTTP_REFERER']);
}
Any Ideas?
To make the round trip "The WordPress Way" on the "front-end" (doesn't work in the context of wp-admin), you need to use 3 WordPress functions:
add_query_arg() - to create the URL with your new query variable ('c' in your example)
the query_vars filter - to modify the list of public query variables that WordPress knows about (this only works on the front-end, because the WP Query is not used on the back end - wp-admin - so this will also not be available in admin-ajax)
get_query_var() - to retrieve the value of your custom query variable passed in your URL.
Note: there's no need to even touch the superglobals ($_GET) if you do it this way.
Example
On the page where you need to create the link / set the query variable:
if it's a link back to this page, just adding the query variable
<a href="<?php echo esc_url( add_query_arg( 'c', $my_value_for_c ) )?>">
if it's a link to some other page
<a href="<?php echo esc_url(
add_query_arg( 'c', $my_value_for_c, site_url( '/some_other_page/' ) )
)?>">
In your functions.php, or some plugin file or custom class (front-end only):
function add_custom_query_var( $vars ){
$vars[] = "c";
return $vars;
}
add_filter( 'query_vars', 'add_custom_query_var' );
On the page / function where you wish to retrieve and work with the query var set in your URL:
$my_c = get_query_var( 'c' );
On the Back End (wp-admin)
On the back end we don't ever run wp(), so the main WP Query does not get run. As a result, there are no query vars and the query_vars hook is not run.
In this case, you'll need to revert to the more standard approach of examining your $_GET superglobal. The best way to do this is probably:
$my_c = filter_input( INPUT_GET, "c", FILTER_SANITIZE_STRING );
though in a pinch you could do the tried and true
$my_c = isset( $_GET['c'] ) ? $_GET['c'] : "";
or some variant thereof.
There are quite few solutions to tackle this issue. First you can go for a plugin if you want:
WordPress Quickie: Custom Query String Plugin
Or code manually, check out this post:
Passing Query String Parameters in WordPress URL
Also check out:
add_query_arg
Since this is a frequently visited post i thought to post my solution in case it helps anyone. In WordPress along with using query vars you can change permalinks too like this
www.example.com?c=123 to www.example.com/c/123
For this you have to add these lines of code in functions.php or your plugin base file.
From shankhan's anwer
add_filter( 'query_vars', 'addnew_query_vars', 10, 1 );
function addnew_query_vars($vars)
{
$vars[] = 'c'; // c is the name of variable you want to add
return $vars;
}
And additionally this snipped to add custom rewriting rules.
function custom_rewrite_basic()
{
add_rewrite_rule('^c/([0-9]+)/?', '?c=$1', 'top');
}
add_action('init', 'custom_rewrite_basic');
For the case where you need to add rewrite rules for a specifc page you can use that page slug to write a rewrite rule for that specific page. Like in the question OP has asked about
www.example.com/news?c=123 to www.example.com/news/123
We can change it to the desired behaviour by adding a little modification to our previous function.
function custom_rewrite_basic()
{
add_rewrite_rule('^news/([0-9]+)/?', 'news?c=$1', 'top');
}
add_action('init', 'custom_rewrite_basic');
Hoping that it becomes useful for someone.
add following code in function.php
add_filter( 'query_vars', 'addnew_query_vars', 10, 1 );
function addnew_query_vars($vars)
{
$vars[] = 'var1'; // var1 is the name of variable you want to add
return $vars;
}
then you will b able to use $_GET['var1']
<?php
$edit_post = add_query_arg('c', '123', 'news' );
?>
Go to New page
You can add any page inplace of "news".
One issue you might run into is is_home() returns true when a registered query_var is present in the home URL. For example, if http://example.com displays a static page instead of the blog, http://example.com/?c=123 will return the blog.
See https://core.trac.wordpress.org/ticket/25143 and https://wordpress.org/support/topic/adding-query-var-makes-front-page-missing/ for more info on this.
What you can do (if you're not attempting to affect the query) is use add_rewrite_endpoint(). It should be run during the init action as it affects the rewrite rules. Eg.
add_action( 'init', 'add_custom_setcookie_rewrite_endpoints' );
function add_custom_setcookie_rewrite_endpoints() {
//add ?c=123 endpoint with
//EP_ALL so endpoint is present across all places
//no effect on the query vars
add_rewrite_endpoint( 'c', EP_ALL, $query_vars = false );
}
This should give you access to $_GET['c'] when the url contains more information like www.example.com/news?c=123.
Remember to flush your rewrite rules after adding/modifying this.
to add parameter to post urls (to perma-links), i use this:
add_filter( 'post_type_link', 'append_query_string', 10, 2 );
function append_query_string( $url, $post )
{
return add_query_arg('my_pid',$post->ID, $url);
}
output:
http://yoursite.com/pagename?my_pid=12345678
This was the only way I could get this to work
add_action('init','add_query_args');
function add_query_args()
{
add_query_arg( 'var1', 'val1' );
}
http://codex.wordpress.org/Function_Reference/add_query_arg
In your case, Just add / after url and then put query arguments. like
www.example.com/news/?c=123 or news/?c=123
instead of
www.example.com/news?c=123 or news?c=123