Utility function: perch_get()
Perch has a number of very helpful utility functions. perch_get() is probably the most used one of them. However, it seems some developers who are new to Perch are not sure what the function actually does.
From the documentation:
The
perch_get()function does the same job as$_GETin PHP, but has some convenient safeguards and options built in.
PHP
In PHP, there is a predefined variable called $_GET. It is:
An associative array of variables passed to the current script via the URL parameters.
So when the page URL is:
example.com/blog/post.php?slug=my-fancy-unicorn,
the array $_GET has an element with:
- the index
slug - and the value of
my-fancy-unicorn.
i.e. the value of $_GET['slug'] is my-fancy-unicorn.
And when the page URL is
example.com/blog/index.php?category=unicorns&page=3,
the value of $_GET['category'] is unicorns and the value of $_GET['page'] is 3.
So the $_GET array allows us to get the URL parameters and their values. This allows us to build dynamic pages.
For instance, you can set up a single page called post.php for blog post detail view for all your posts. This page can display any blog post you have by simply passing a URL paramter with the post’s slug like so:
post.php?slug=2018-03-07-big-news
What’s the problem?
While $_GET is great, you need to write more code to use it safely.
When you use $_GET['slug'] on the page post.php with the URL /blog/post.php?slug=my-fancy-unicorn, you get the value of slug.
When you use $_GET['slug'] on the same page, without the ?slug= parameter, you get a PHP error. That’s because the $_GET['slug'] is not set.
So instead of simply using:
$slug = $_GET['slug'];
You would test whether it is been set first AND whether it is empty:
if ( isset($_GET['slug']) && $_GET['slug'] != '' ) {
$slug = $_GET['slug'];
}
And in some cases you may also want to set a default value in case it is not set:
$category = 'some-default-value';
// overwrite default value
if (isset($_GET['category']) && $_GET['category'] != '') {
$category = $_GET['category'];
}
So it can be a little inconvenient to keep adding these if statements all the time.
perch_get()
The perch_get() utility function makes using URL parameters easier. For a start, it doesn’t throw an error if the URL parameter doesn’t exist.
perch_get('slug') on a page with the URL /blog/post.php?slug=my-fancy-unicorn, returns the value my-fancy-unicorn just like $_GET['slug'].
However, perch_get('slug') on a page with the URL /blog/post.php, returns false instead of throwing an error.
$_GET vs perch_get()
This:
/* === $_GET === */
if (isset($_GET['slug']) && $_GET['slug'] != '') {
$slug = $_GET['slug'];
}
is the same as this:
/* === perch_get() === */
if (perch_get('slug')) {
$slug = perch_get('slug');
}
With $_GET the following throws an error if ?slug= is not present:
/* === $_GET - does not work === */
$slug = $_GET['slug'];
if ($slug && $slug != '') {
perch_blog_post($slug);
}
With perch_get() you write less code and it works even if ?slug= is not present in the URL:
/* === perch_get() - works === */
$slug = perch_get('slug');
if ($slug) {
perch_blog_post($slug);
}
Defaults
Assigning a default value is another cool feature of perch_get().
Here’s one way to do it with $_GET:
/* === $_GET === */
$category = 'some-default-value';
if (isset($_GET['category']) && $_GET['category'] != '') {
$category = $_GET['category'];
}
With perch_get() you can assign a default value like so:
/* === perch_get() === */
$category = perch_get('category', 'some-default-category');
So you can really replace the following 5 lines of code:
/* === $_GET === */
$number_of_posts = 9;
if (isset($_GET['count']) && $_GET['count'] != '') {
$number_of_posts = $_GET['count'];
}
perch_blog_recent_posts($number_of_posts);
with a single line:
/* === perch_get() === */
perch_blog_recent_posts(perch_get('count', 9));