In order to launch an inexpensive global network of sites run by volunteers that would provide shoppers categorized directories to local stores, I needed to leverage the power of WordPress with some unusual customizations and workarounds. There are a number of approaches to providing local experiences with WordPress. In this tutorial, I'm going to show you why and how we decided to make a customized solution.
In July, I launched a global guide to Internet-based alternatives to shopping at Amazon called FleetheJungle.com and the response was excellent. We received a lot of media coverage and subsequent traffic. It's not a database-driven app; instead we leveraged the outstanding KnowHow knowledge base theme:

But to grow the site, we needed to offer geolocal versions for individual cities. Certainly the global site helps visitors cancel their prime memberships or find alternatives to Kindle books but there was nothing to encourage people to support small businesses in their communities.
To begin, we'd build a guide for local shoppers in nearby Portland, a city with a proud heritage of quirky, independent small businesses.

Certainly, I've written enough about quickly launching a plethora of WordPress websites using pre-configured, pre-optimized recipes, but maintaining related requirements for a network can be extremely time-consuming—things like managing SEO, WordPress and plugin upgrades, etc.
I also considered WordPress Multisite but even though I know she's grown a lot, we had a number of awkward difficult pairings and were probably never meant to be together. Once you get involved with "her", it's very hard to break up.
I needed a simpler solution.
In this tutorial, I'll guide you through customizations and tricks I used with WordPress and my knowledge base theme to launch our Portland shopping guide and make it easy to launch any number of other cities—while avoiding the overhead of managing dozens or hundreds of sites.
Here are some of the basic requirements for launching more sites:
1. Maintain a worldwide site. I wanted to keep the global, fleethejungle.com primary domain intact, free of local articles but instead a guide to our available cities.
2. Localize by sub-domain. I wanted content localized by sub-domain. For example, a visit to http://portland.fleethejungle.com would promote local content on the site while re-using some specific national site categories related to shopping on the broader Internet, e.g. video streaming (there's no Portland-based alternative to HBO Now). CraigsList provides a good model for this.
3. Integration between local and worldwide. I wanted to provide local visitors an explanation of the differences between their local site and the global site while encouraging them to participate in helping improve the listings in their city.
4. Volunteer-managed. I wanted to make it easy to regularly add cities to the site in a way that would only require volunteers with basic blogging skills to launch and maintain. There are too many requirements to launching new WordPress sites for each individual city to easily do this with volunteers.
5. Minimal maintenance. Finally, I wanted to keep the maintenance of the site network as simple as running a single site.
Let's explore some of the technical approaches that are often used to address these kinds of requirements.
For content management, there are three basic approaches I thought of:
As I said earlier, I'm not a fan of Multisite and I wanted to avoid the complexity of launching and maintaining a variety of WordPress sites. A site like Flee the Jungle would have so much central content that would need to be re-used across city pages (such as how to terminate your Prime membership), and I didn't want to have to maintain this content across different WordPress installations—or write code to do so.
I decided to filter the content depending on the domain or subdomain used by the visitor in the browser.
If you've read my tutorial How to Use Zillow Neighborhood Maps and HTML5 Geolocation, you know how to use HTML5 browser-based geolocation for determining where a user is. However, I wanted the user to have more control.
I wanted the user to use a sub-domain like the one that's worked for years with CraigsList to guide them to their city.

But WordPress's dominion over absolute URLs makes this difficult. When I first began experimenting with tracking the inbound sub-domain for a city and mapping it to links on the page, I ran into WordPress's habit of creating absolute links nearly everywhere. A colleague I spoke to about it laughed immediately when I asked him about it—it's a common foe of WordPress developers.
In this tutorial, I'll share the customizations within our theme's PHP-based queries to build our city-based sites and how we ultimately worked around the absolute URL problem.
Here's how I decided to implement city-based sites for Flee the Jungle that could be easily maintained and authored by local bloggers without additional technical skills.
Articles written for cities would be tagged by city name, e.g. "portland". Articles for the global site would be tagged "worldwide". I wanted the ability to include worldwide articles about Internet-based stores for some categories where there was less effective local support such as video streaming. Other categories are certainly appropriate to focus exclusively on local stores such as Groceries, Auto Stores and Toy Stores.
For geolocal sites, we keep the worldwide categories in place and only show different articles for the locally appropriate categories. In the future, we'll append worldwide articles to the local choices within a category when appropriate.
When visitors view category pages and search, we also filter and customize the results based on these design choices.
To do this, we define arrays within the theme by their IDs:
Here are a few examples. First, here's my array of worldwide (nonlocal) category IDs:
// Category IDs that are worldwide, digital to be displayed without changes // e.g. Getting Started, Prime and Smile Alternatives, Streaming Media, etc. $nonlocal_category_ids = [1,22,29,30,46,57,60,195];
You can retrieve those from peeking at the category ID in the dashboard category list (by hovering with the mouse over the category name as shown further below with tags):

Or, edit the category and grab the ID from the edit URL (Getting Started is 29):

Here are the tag IDs for Seattle and Portland:
// Tag IDs for city names e.g. Seattle, Portland $known_cities = array(49,211);
Seattle is 49. You can see the tag id by hovering over the city and letting the status bar reveal it:

To obtain the domain or sub-domain, I used Trevor Scott's WordPress tip and placed it within my theme's functions.php.
Here's the WordPress Dashboard Theme Editor:

And, here's Trevor's code:
/**
* @author Trevor Scott <trevor@trevor.net>
* @version 1.0 2010-12-07
*https://wordpress.org/support/topic/how-do-i-get-sub-domain-name
* Grab the subdomain portion of the URL. If there is no sub-domain, the root
* domain is passed back. By default, this function *returns* the value as a
* string. Calling the function with echo = true prints the response directly to
* the screen.
*
* @param bool $echo
*/
function arrested_subdomain($echo = false) {
$hostAddress = explode ( '.', $_SERVER ["HTTP_HOST"] );
if (is_array ( $hostAddress )) {
if (eregi ( "^www$", $hostAddress [0] )) {
$passBack = 1;
} else {
$passBack = 0;
}
if ($echo == false) {
return ($hostAddress [$passBack]);
} else {
echo ($hostAddress [$passBack]);
}
} else {
return (false);
}
}When visitors arrive at the global home page, the domain will be fleethejungle.com rather than a sub-domain. I've created another function, configure_geolocal(), which is called at the beginning of the template header.php file. Here's the first part of the function:
function configure_geolocal() {
global $nonlocal_category_ids;
global $known_cities;
global $domain_locale;
global $logo_image_url;
// Tag IDs for city names e.g. Seattle, Portland
$known_cities = array(49,211);
// Category IDs that are worldwide, digital to be displayed without changes
// e.g. Getting Started, Prime and Smile Alternatives, Streaming Media, etc.
$nonlocal_category_ids = [1,22,29,30,46,57,60,195];
$domain_locale = arrested_subdomain();
if ($domain_locale == 'www' or $domain_locale == 'fleethejungle') {
$domain_locale = false;Here's how it's called by get_header() within the theme's header.php:
<?php configure_geolocal(); ?> <!DOCTYPE html> <html <?php language_attributes(); ?>> <head> <meta charset="<?php bloginfo( 'charset' ); ?>" /> <meta content="width=device-width,minimum-scale=1,maximum-scale=1" name="viewport"> <meta name="format-detection" content="telephone=no"> <meta http-equiv="X-UA-Compatible" content="IE=Edge"/>
When the domain is global, $domain_locale will be false. Under these circumstances, I will exclude articles tagged locally by cities. And I will do this on the home page and the category page. When the domain refers to a local city, $domain_locale will represent the prefix, e.g. seattle or portland.
In the theme's home page, if the visitor is on the worldwide site (root domain), I exclude articles tagged with cities from the $st_cat_post_args array. However, if the visitor is on a city page and the sub-domain is known, we only display local articles in most categories except those identified for nonlocal_category_ids—those are the ones more appropriate for non-local content such as video streaming:
global $known_cities;
global $nonlocal_category_ids;
global $domain_locale;
if ($domain_locale===false) {
// root visit
$st_cat_post_args['tag__not_in']=$known_cities;
} else {
// local city being viewed but include worldwide articles in this category
if (in_array($st_category->term_id,$nonlocal_category_ids) {
$st_cat_post_args['tag_slug__in']=array($domain_locale,'worldwide');
} else {
// only show local articles
$st_cat_post_args['tag_slug__in']=array($domain_locale);
}Here's the code within the context of more of the function:
//List Posts
$st_cat_post_num = of_get_option('st_hp_cat_postnum');
$st_posts_order = of_get_option('st_hp_cat_posts_order');
global $post;
// If show posts is 0 do nothing
if ($st_cat_post_num != 0) {
// Listed by popular?
if ($st_posts_order == 'meta_value_num') {
$st_cat_post_args = array(
'numberposts' => $st_cat_post_num,
'orderby' => $st_posts_order,
'meta_key' => '_st_post_views_count',
'category__in' => $st_category->term_id
);
} else {
$st_cat_post_args = array(
'numberposts' => $st_cat_post_num,
'orderby' => $st_posts_order,
'category__in' => $st_category->term_id
);
}
global $known_cities;
global $nonlocal_category_ids;
global $domain_locale;
if ($domain_locale===false) {
// root visit
$st_cat_post_args['tag__not_in']=$known_cities;
} else {
// local city being viewed but include worldwide articles in this category
if (in_array($st_category->term_id,$nonlocal_category_ids) {
$st_cat_post_args['tag_slug__in']=array($domain_locale,'worldwide');
} else {
// only show local articles
$st_cat_post_args['tag_slug__in']=array($domain_locale);
}
$st_cat_posts = get_posts($st_cat_post_args);
echo '<ul class="category-posts">';
foreach($st_cat_posts as $post) : setup_postdata($post);
?>
<?php
// Set post format class
if ( has_post_format( 'video' )) {
$st_postformat_class = 'video';
} else {
$st_postformat_class = 'standard';
}
?>
<li class="format-<?php echo $st_postformat_class; ?>"><a href="<?php the_permalink(); ?>">
<?php the_title(); ?>
</a></li>
<?php
endforeach;
echo '</ul>';With the KnowHow theme, visitors may also click on the category headings, taking them to an article list within the category.
If they are on the global site, I want to show only global articles. I chose to tag all global articles as 'worldwide' to facilitate this.
So for the global site, I show only articles tagged 'worldwide' and for local city sites, I show only articles tagged for that city. If the category is an exceptional case for both, we include articles from both the current city and worldwide.
Here's the code within the theme's category.php:
<?php while ( have_posts() ) : { ?>
<?php
the_post();
$show_post = false;
if ($GLOBALS["domain_locale"]===false) {
// root worldwide visit, exclude local articles
if (has_tag('worldwide')) {
$show_post=true;
}
} else {
// local city being viewed
if (in_array($current_cat,$GLOBALS['nonlocal_category_ids'])) {
// include worldwide articles in this category
if (has_tag($GLOBALS["domain_locale"]) || has_tag('worldwide')) {
$show_post=true;
}
} else {
// only show local articles
if (has_tag($GLOBALS["domain_locale"])) {
$show_post=true;
}
}
}
if ($show_post) {
get_template_part( 'content', get_post_format());
}
?>
<?php } endwhile; ?>I'm not customizing the query here because performance is currently not a major issue. I'm just skipping results out of context and not displaying them.
In the future, I may customize this further for city sites by displaying worldwide results at the bottom of the category page in a distinct section.
It's also important to perform these sorts of customizations for search. The KnowHow theme provides an AJAX search result or a generated page of results. We need to provide code to customize each option.
Live AJAX Search
For live search, there is no get_header() call so we need to configure our location dynamically:
<?php if(!empty($_GET['ajax']) ? $_GET['ajax'] : null) { // Is Live Search ?>
<?php
// get geolocal settings for live search only
configure_geolocal();
?>Then we integrate the same logic used on category pages within live search results:
// check if one of its categories is excluded from local
$category_excluded=false;
foreach((get_the_category()) as $category) {
if (in_array($category->cat_ID,$GLOBALS['nonlocal_category_ids'])) {
$category_excluded=true;
break;
}
}
if ($GLOBALS["domain_locale"]!==false && has_tag( $GLOBALS["domain_locale"]) || ($category_excluded && has_tag('worldwide'))) { ?>
<li class="<?php echo $st_search_class ?>">
<?php if ( 'st_faq' == get_post_type() ) { ?>
<a href="<?php echo home_url(); ?>/<?php echo $st_faq_slug ?>/#faq-<?php the_ID(); ?>"><?php the_title(); ?></a>
<?php } else { ?>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<?php } ?>
</li>
<?php } else { ?>
<?php if ($GLOBALS["domain_locale"]===false && has_tag( "worldwide")) { ?>
<li class="<?php echo $st_search_class ?>">
<?php if ( 'st_faq' == get_post_type() ) { ?>
<a href="<?php echo home_url(); ?>/<?php echo $st_faq_slug ?>/#faq-<?php the_ID(); ?>"><?php the_title(); ?></a>
<?php } else { ?>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<?php } ?>
</li>
<?php } ?>
<?php } ?>Dynamic Search Results Page
If it's not AJAX, then get_header() is called for us and it's a bit simpler:
<?php while ( have_posts() ) : the_post(); ?>
<?php
// check if one of its categories is excluded from local
$category_excluded=false;
foreach((get_the_category()) as $category) {
if (in_array($category->cat_ID,$GLOBALS['nonlocal_category_ids'])) {
$category_excluded=true;
break;
}
}
if ($GLOBALS["domain_locale"]!==false && has_tag( $GLOBALS["domain_locale"]) || ($category_excluded && has_tag('worldwide'))) {
get_template_part( 'content', get_post_format());
} else {
if ($GLOBALS["domain_locale"]===false && has_tag( "worldwide")) { get_template_part( 'content', get_post_format()); }
}
?>
<?php endwhile; ?>As I mentioned above for Categories, I may decide to customize search results to display a second section of results for global articles on city sites.
To provide local visitors an explanation of the differences between their local site and the global site while encouraging them to participate in helping improve the listings in their city, I used a plugin I wrote about in January 2015 for Envato Tuts+: The Benefits of Using the Free Shortcoder Plugin. It's a plugin that lets you use macros essentially to expand re-usable HTML content in place. For each city article, we're using it to customize what local visitors see when they arrive from Portland.
Once the plugin was installed, I created a shortcode for each city such as [sc:pdx] which provides a simple blurb at the top of local article pages:

Then, whenever we added a local article, we included the shortcode [sc:pdx] at the top:

Here's what the article looks like when visitors arrive:

I'm a long-time user of Digital Ocean but I'm becoming a more enthusiastic fan of WP Engine as well; well-managed hosting provides advantages in some circumstances. It turned out WP Engine offered a solution to the WordPress absolute URL problem which was better than alternatives.
WP Engine offers a post-processing filter in which you can use regular expressions to modify code. After considering other approaches to modifying WordPress and using its own APIs for this, I decided that it would be simplest to simply replace absolute links to FleeTheJungle.com with relative addresses. This allowed users visiting a city-based sub-domain to remain within the geolocal site:

Prior to configuring this, visits to Portland Flee the Jungle sub-domain had outbound links to the global fleethejungle.com scattered across pages. After configuring it, outbound links remained consistent with the inbound domain or sub-domain.
Essentially, I used the post-processing filter to eliminate absolute URLs and allow the browser's URL and relative addresses to drive navigation.
To provide a directory of the cities where Flee the Jungle is and would become available, I built a page listing cities where global users could jump into. I also use it to attract volunteers to launch sites for their cities.

Here's the final code we used within WordPress for configure_geolocal():
function configure_geolocal() {
global $nonlocal_category_ids;
global $known_cities;
global $domain_locale;
global $logo_image_url;
// Tag IDs for city names e.g. Seattle, Portland
$known_cities = array(49,211);
// Category IDs that are worldwide, digital to be displayed without changes
// e.g. Getting Started, Prime and Smile Alternatives, Streaming Media, etc.
$nonlocal_category_ids = [1,22,29,30,46,57,60,195];
$domain_locale = arrested_subdomain();
if ($domain_locale == 'www' or $domain_locale == 'fleethejungle') {
$domain_locale = false;
$logo_image_url = '/wp-content/uploads/2015/10/ftj-logo-global.gif';
} else if ($domain_locale == 'pdx' or $domain_locale =='portland') {
$domain_locale = 'portland';
$logo_image_url = '/wp-content/uploads/2015/10/ftj-logo-portland.gif';
} else if ($domain_locale == 'sea' or $domain_locale =='seattle') {
$domain_locale = 'seattle';
$logo_image_url = '/wp-content/uploads/2015/10/ftj-logo-seattle.gif';
} else {
// unknown city - redirect
wp_redirect( 'http://fleethejungle.com/cities' ); exit;
}
}Of course, I wanted to implement basic customization of the logo depending on the sub-domain. The KnowHow theme doesn't support this natively.

If you notice in the final configure_geolocal() code, I set a media library URL for the logos for each city.
Then, the code within header.php customizes the theme logo URL based on the domain here:
<!-- #logo -->
<div id="logo">
<?php if (is_front_page()) { ?><h1><?php } ?>
<a title="<?php bloginfo( 'name' ); ?>" href="<?php echo home_url(); ?>">
<?php if (of_get_option('st_logo')) { ?>
<img alt="<?php bloginfo( 'name' ); ?>" src="<?php echo $GLOBALS["logo_image_url"] ?>">
<?php } else { ?>
<?php bloginfo( 'name' ); ?>
<?php } ?>
</a>
<?php if (is_front_page()) { ?></h1><?php } ?>
</div>
<!-- /#logo -->WP Engine's domain mapping can be a bit confusing for the uninitiated. You have to add domains for your site and map them to WP Engine's internal addressing system. If you want sub-domains to operate properly, you have to individually configure each sub-domain from within the WP Engine domains dashboard.
This took me a little while to figure out. Here I am adding a placeholder arrival page for San Francisco, which can be reached by sanfrancisco.fleethejungle.com or sfbay.fleethejungle.com. WP Engine makes it easy to set up these redirects:

Here's a preliminary view of domains configured for global and local Flee the Jungle:

Unfortunately, cities that you don't explicitly add redirect to a 404 error at WP Engine. There are other ways to work around this, but for the moment, I'm just adding larger cities to the configuration there. People will generally be directed to the global home page or a pre-existing city—from there, they can volunteer to start their own city.
Google's internal search engine optimization is well known for being quite secret, yet much of the referral traffic your site receives depends on it.
Some of our content will appear across multiple domains, but much of it will be distinct depending on which city we're browsing. Google doesn't like seeing the same content on multiple sites, but it's also good at indexing sub-domains separately.
Frankly, I have no idea how the Flee the Jungle geolocal network model will be received and ranked within its great supercomputing megaplex. This is a lower priority for me at the moment. The foundation of Flee the Jungle's traffic is grassroots support and social sharing.
Please compare the differences in content between worldwide Flee the Jungle and Portland's local city site:

Certainly, there are a number of ways I could have approached the challenge of creating geolocal sites. However, Flee the Jungle remains a volunteer effort—I needed a solution that would be simple and fast while making it easy to add cities, leveraging bloggers as volunteers. The approach I've described has accomplished these goals quickly.
The result of all this customization is that we have a single WordPress installation that can run hundreds of geo-local variations of our site, with worldwide and local content appropriately filtered and organized. Most importantly, volunteers can build and launch cities with only the basic skills of a WordPress blogger. This is so much simpler and faster than my "friend" WordPress multisite or running separate installations. The future is relatively unbounded.
I hope you've enjoyed this tutorial and would enjoy hearing how you might have approached this challenge. If you'd like to launch a shopping guide for your own city, contact us. If you're intrigued about building a site like this, I've written a detailed, step by step tutorial for building your own knowledge base website on WordPress. Let's say you want to launch your own Harry Potter fan site—it's an easy guide to getting started.
Please feel free to post your questions and comments below. You can also contact me on Twitter @reifman or email me directly. You can also browse my Envato Tuts+ instructor page to see other tutorials I've written.
The Best Small Business Web Designs by DesignRush
/
4Create Modern Vue Apps Using Create-Vue and Vite
/
8Pros and Cons of Using WordPress
/
-1How to Fix the “There Has Been a Critical Error in Your Website” Error in WordPress
/
1How To Fix The “There Has Been A Critical Error in Your Website” Error in WordPress
How to Create a Privacy Policy Page in WordPress
/
7WordPress Website Maintenance Guide For Beginners
/
8How Long Does it Take to Learn JavaScript
/
1The Best Way to Deep Copy an Object in JavaScript
/
-3
3
-6Adding and Removing Elements From Arrays in JavaScript
/
-2Create a JavaScript AJAX Post Request: With and Without jQuery
/
85 Real-Life Uses for the JavaScript reduce() Method
/
-8How to Enable or Disable a Button With JavaScript: jQuery vs. Vanilla
/
4How to Enable or Disable a Button With JavaScript: jQuery vs Vanilla
/
-3Confirm Yes or No With JavaScript
/
-5How to Change the URL in JavaScript: Redirecting
/
-215+ Best WordPress Twitter Widgets
/
-227 Best Tab and Accordion Widget Plugins for WordPress (Free & Premium)
/
1121 Best Tab and Accordion Widget Plugins for WordPress (Free & Premium)
/
-1130 HTML Best Practices for Beginners
/
-731 Best WordPress Calendar Plugins and Widgets (With 5 Free Plugins)
/
325 Ridiculously Impressive HTML5 Canvas Experiments
/
-4
1How to Implement Email Verification for New Members
/
3How to Create a Simple Web-Based Chat Application
/
730 Popular WordPress User Interface Elements
/
-3Top 18 Best Practices for Writing Super Readable Code
/
1Best Affiliate WooCommerce Plugins Compared
/
-1218 Best WordPress Star Rating Plugins
/
1410+ Best WordPress Twitter Widgets
/
320+ Best WordPress Booking and Reservation Plugins
/
5Working With Tables in React: Part Two
/
-3Best CSS Animations and Effects on CodeCanyon
/
-1730 CSS Best Practices for Beginners
/
5How to Create a Custom WordPress Plugin From Scratch
/
310 Best Responsive HTML5 Sliders for Images and Text… and 3 Free Options
/
-516 Best Tab and Accordion Widget Plugins for WordPress
/
-518 Best WordPress Membership Plugins and 5 Free Plugins
/
625 Best WooCommerce Plugins for Products, Pricing, Payments and More
/
110 Best WordPress Twitter Widgets
1 /
1112 Best Contact Form PHP Scripts for 2020
/
-320 Popular WordPress User Interface Elements
/
-410 Best WordPress Star Rating Plugins
/
-412 Best CSS Animations on CodeCanyon
/
-112 Best WordPress Booking and Reservation Plugins
/
120 Best WordPress Calendar Plugins and Widgets
/
-312 Elegant CSS Pricing Tables for Your Latest Web Project
/
824 Best WordPress Form Plugins for 2020
/
-214 Best PHP Event Calendar and Booking Scripts
/
-1Getting Started With Django: Newly Updated Course
/
-1Create a Blog for Each Category or Department in Your WooCommerce Store
/
28 Best WordPress Booking and Reservation Plugins
/
-15Best Exit Popups for WordPress Compared
/
19Best Exit Popups for WordPress Compared
/
-411 Best Tab & Accordion WordPress Widgets & Plugins
/
-1212 Best Tab & Accordion WordPress Widgets & Plugins
1 /
2New Course: Practical React Fundamentals
/
2Short Course: Better Angular App Architecture With Modules
/
3Preview Our New Course on Angular Material
/
5Build Your Own CAPTCHA and Contact Form in PHP
/
-1Object-Oriented PHP With Classes and Objects
/
1Best Practices for ARIA Implementation
/
-5Accessible Apps: Barriers to Access and Getting Started With Accessibility
/
-3Dramatically Speed Up Your React Front-End App Using Lazy Loading
/
1715 Best Modern JavaScript Admin Templates for React, Angular, and Vue.js
/
-1615 Best Modern JavaScript Admin Templates for React, Angular and Vue.js
/
319 Best JavaScript Admin Templates for React, Angular, and Vue.js
/
3New Course: Build an App With JavaScript and the MEAN Stack
/
11Hands-on With ARIA: Accessibility Recipes for Web Apps
/
710 Best WordPress Facebook Widgets
13Hands-on With ARIA: Accessibility for eCommerce
/
6New eBooks Available for Subscribers
/
-10Hands-on With ARIA: Homepage Elements and Standard Navigation
/
11
-4Site Accessibility: Getting Started With ARIA
/
5How Secure Are Your JavaScript Open-Source Dependencies?
/
-4New Course: Secure Your WordPress Site With SSL
/
-3Testing Components in React Using Jest and Enzyme
/
-9Testing Components in React Using Jest: The Basics
/
-515 Best PHP Event Calendar and Booking Scripts
/
-3Create Interactive Gradient Animations Using Granim.js
/
10How to Build Complex, Large-Scale Vue.js Apps With Vuex
1 /
-2Examples of Dependency Injection in PHP With Symfony Components
/
-5Set Up Routing in PHP Applications Using the Symfony Routing Component
1 /
8A Beginner’s Guide to Regular Expressions in JavaScript
/
9Introduction to Popmotion: Custom Animation Scrubber
/
-6Introduction to Popmotion: Pointers and Physics
/
-10New Course: Connect to a Database With Laravel’s Eloquent ORM
/
-5How to Create a Custom Settings Panel in WooCommerce
/
-14Building the DOM faster: speculative parsing, async, defer and preload
1 /
320 Useful PHP Scripts Available on CodeCanyon
3 /
51How to Find and Fix Poor Page Load Times With Raygun
/
1Introduction to the Stimulus Framework
/
-11Single-Page React Applications With the React-Router and React-Transition-Group Modules
/
1
712 Best Contact Form PHP Scripts
1 /
-3Getting Started With the Mojs Animation Library: The ShapeSwirl and Stagger Modules
/
1Getting Started With the Mojs Animation Library: The Shape Module
/
-3Getting Started With the Mojs Animation Library: The HTML Module
/
5Project Management Considerations for Your WordPress Project
/
-68 Things That Make Jest the Best React Testing Framework
/
2Creating an Image Editor Using CamanJS: Layers, Blend Modes, and Events
/
-1New Short Course: Code a Front-End App With GraphQL and React
/
2Creating an Image Editor Using CamanJS: Applying Basic Filters
/
-13Creating an Image Editor Using CamanJS: Creating Custom Filters and Blend Modes
/
-1Modern Web Scraping With BeautifulSoup and Selenium
/
1Challenge: Create a To-Do List in React
1 /
-2Deploy PHP Web Applications Using Laravel Forge
/
-3Getting Started With the Mojs Animation Library: The Burst Module
/
6
-910 Things Men Can Do to Support Women in Tech
/
-3A Gentle Introduction to Higher-Order Components in React: Best Practices
/
-5Challenge: Build a React Component
/
-4A Gentle Introduction to HOC in React: Learn by Example
/
2A Gentle Introduction to Higher-Order Components in React
/
-6Creating Pretty Popup Messages Using SweetAlert2
/
6Creating Stylish and Responsive Progress Bars Using ProgressBar.js
/
1818 Best Contact Form PHP Scripts for 2022
/
-3How to Make a Real-Time Sports Application Using Node.js
/
-2Creating a Blogging App Using Angular & MongoDB: Delete Post
/
-15Creating a Blogging App Using Angular & MongoDB: Show Post
/
10Creating a Blogging App Using Angular & MongoDB: Home
/
8
4Creating a Blogging App Using Angular & MongoDB: Login
/
11Creating Your First Angular App: Implement Routing
/
13Persisted WordPress Admin Notices: Part 4
/
-3Creating Your First Angular App: Components, Part 2
/
4Persisted WordPress Admin Notices: Part 3
/
4
8Persisted WordPress Admin Notices: Part 2
/
-2Create Your First Angular App: Storing and Accessing Data
/
5Persisted WordPress Admin Notices: Part 1
/
-4Error and Performance Monitoring for Web & Mobile Apps Using Raygun
/
5Using Luxon for Date and Time in JavaScript
7 /
-6How to Create an Audio Oscillator With the Web Audio API
/
-5How to Cache Using Redis in Django Applications
/
120 Essential WordPress Utilities to Manage Your Site
/
-6Introduction to API Calls With React and Axios
/
16Beginner’s Guide to Angular 4: HTTP
/
12Rapid Web Deployment for Laravel With GitHub, Linode, and RunCloud.io
/
10Beginners Guide to Angular 4: Routing
/
-9Beginner’s Guide to Angular 4: Components
/
3Creating a Drop-Down Menu for Mobile Pages
/
6Introduction to Forms in Angular 4: Writing Custom Form Validators
/
5Getting Started With Redux: Connecting Redux With React
/
15Getting Started With Redux: Learn by Example
/
14Getting Started With Redux: Why Redux?
/
11Understanding Recursion With JavaScript
/
-1How to Auto Update WordPress Salts
/
-3How to Download Files in Python
/
-3
-21Eloquent Mutators and Accessors in Laravel
1 /
15
-11
1210 Best HTML5 Sliders for Images and Text
/
8Site Authentication in Node.js: User Signup
/
-2Creating a Task Manager App Using Ionic: Part 2
/
3Creating a Task Manager App Using Ionic: Part 1
/
1Introduction to Forms in Angular 4: Reactive Forms
/
2
4Introduction to Forms in Angular 4: Template-Driven Forms
/
424 Essential WordPress Utilities to Manage Your Site
/
-325 Essential WordPress Utilities to Manage Your Site
/
-10Get Rid of Bugs Quickly Using BugReplay
1 /
-17Manipulating HTML5 Canvas Using Konva: Part 1, Getting Started
/
610 Must-See Easy Digital Downloads Extensions for Your WordPress Site
/
-322 Best WordPress Booking and Reservation Plugins
/
-4Understanding ExpressJS Routing
/
-715 Best WordPress Star Rating Plugins
/
11Creating Your First Angular App: Basics
/
-1Inheritance and Extending Objects With JavaScript
/
-9Introduction to the CSS Grid Layout With Examples
1 /
4
6Performant Animations Using KUTE.js: Part 5, Easing Functions and Attributes
/
-9Performant Animations Using KUTE.js: Part 4, Animating Text
/
-12Performant Animations Using KUTE.js: Part 3, Animating SVG
/
-8New Course: Code a Quiz App With Vue.js
/
-2Performant Animations Using KUTE.js: Part 2, Animating CSS Properties
/
2
9Performant Animations Using KUTE.js: Part 1, Getting Started
/
110 Best Responsive HTML5 Sliders for Images and Text (Plus 3 Free Options)
/
-3Single-Page Applications With ngRoute and ngAnimate in AngularJS
/
-13Deferring Tasks in Laravel Using Queues
/
-4
2Site Authentication in Node.js: User Signup and Login
/
11Working With Tables in React, Part Two
/
-17Working With Tables in React, Part One
/
3How to Set Up a Scalable, E-Commerce-Ready WordPress Site Using ClusterCS
/
-4New Course on WordPress Conditional Tags
/
3
-11Building With Vue.js 2 and Firebase
6 /
13
-8Best Unique Bootstrap JavaScript Plugins
/
-6
-2Essential JavaScript Libraries and Frameworks You Should Know About
/
6
2Vue.js Crash Course: Create a Simple Blog Using Vue.js
/
-13Build a React App With a Laravel RESTful Back End: Part 1, Laravel 5.5 API
/
3API Authentication With Node.js
/
-4Beginner’s Guide to Angular: HTTP
/
7Beginner’s Guide to Angular: Routing
/
-3Beginners Guide to Angular: Routing
/
-3Beginner’s Guide to Angular: Services
/
2Beginner’s Guide to Angular: Components
/
1How to Create a Custom Authentication Guard in Laravel
/
6Learn Computer Science With JavaScript: Part 3, Loops
/
-4Build Web Applications Using Node.js
/
1Learn Computer Science With JavaScript: Part 4, Functions
/
4Learn Computer Science With JavaScript: Part 2, Conditionals
/
12Create Interactive Charts Using Plotly.js, Part 5: Pie and Gauge Charts
/
-8Create Interactive Charts Using Plotly.js, Part 4: Bubble and Dot Charts
/
16Create Interactive Charts Using Plotly.js, Part 3: Bar Charts
/
-11Awesome JavaScript Libraries and Frameworks You Should Know About
/
-5Create Interactive Charts Using Plotly.js, Part 2: Line Charts
/
-8Bulk Import a CSV File Into MongoDB Using Mongoose With Node.js
/
-6Build a To-Do API With Node, Express, and MongoDB
/
-8Getting Started With End-to-End Testing in Angular Using Protractor
/
10TypeScript for Beginners, Part 4: Classes
/
-17Object-Oriented Programming With JavaScript
/
410 Best Affiliate WooCommerce Plugins Compared
/
5Stateful vs. Stateless Functional Components in React
/
8Make Your JavaScript Code Robust With Flow
/
-3Build a To-Do API With Node and Restify
/
7Testing Components in Angular Using Jasmine: Part 2, Services
/
2Testing Components in Angular Using Jasmine: Part 1
/
-1Creating a Blogging App Using React, Part 6: Tags
/
-9React Crash Course for Beginners, Part 3
/
3React Crash Course for Beginners, Part 2
/
6React Crash Course for Beginners, Part 1
/
2Set Up a React Environment, Part 4
1 /
9Set Up a React Environment, Part 3
/
-9New Course: Get Started With Phoenix
/
-9Set Up a React Environment, Part 2
/
1Command Line Basics and Useful Tricks With the Terminal
/
8How to Create a Real-Time Feed Using Phoenix and React
/
-3Build a React App With a Laravel Back End: Part 2, React
/
3Build a React App With a Laravel RESTful Back End: Part 1, Laravel 9 API
/
-5Creating a Blogging App Using React, Part 5: Profile Page
/
-3Pagination in CodeIgniter: The Complete Guide
/
22JavaScript-Based Animations Using Anime.js, Part 4: Callbacks, Easings, and SVG
JavaScript-Based Animations Using Anime.js, Part 3: Values, Timeline, and Playback
Learn to Code With JavaScript: Part 1, The Basics
/
510 Elegant CSS Pricing Tables for Your Latest Web Project
/
-8Getting Started With the Flux Architecture in React
/
-2Getting Started With Matter.js: The Composites and Composite Modules
/
2Getting Started With Matter.js: The Engine and World Modules
/
1410 More Popular HTML5 Projects for You to Use and Study
/
-22Understand the Basics of Laravel Middleware
/
-2Iterating Fast With Django & Heroku
/
9Creating a Blogging App Using React, Part 4: Update & Delete Posts
/
4Creating a jQuery Plugin for Long Shadow Design
/
-12How to Register & Use Laravel Service Providers
2 /
-13Unit Testing in React: Shallow vs. Static Testing
/
4Creating a Blogging App Using React, Part 3: Add & Display Post
/
14Creating a Blogging App Using React, Part 2: User Sign-Up
20 /
-5Creating a Blogging App Using React, Part 1: User Sign-In
/
69 More Popular HTML5 Projects for You to Use and Study
/
16Creating a Grocery List Manager Using Angular, Part 2: Managing Items
/
89 Elegant CSS Pricing Tables for Your Latest Web Project
/
-1Dynamic Page Templates in WordPress, Part 3
/
-3Angular vs. React: 7 Key Features Compared
/
6Creating a Grocery List Manager Using Angular, Part 1: Add & Display Items
/
2New eBooks Available for Subscribers in June 2017
/
6Create Interactive Charts Using Plotly.js, Part 1: Getting Started
/
10The 5 Best IDEs for WordPress Development (And Why)
/
-133 Popular WordPress User Interface Elements
/
2New Course: How to Hack Your Own App
/
-11How to Install Yii on Windows or a Mac
/
4What Is a JavaScript Operator?
/
-6How to Register and Use Laravel Service Providers
/
9
waly Good blog post. I absolutely love this…