Enabling Multiple Domain Names and Sites on Apache2 Server

Today I set up a new server and I am documenting exactly how to set up multiple domain names, sub domains and websites on a new Apache2 Server. I am using Ubuntu, but I believe these directions are similar for any Linux Apache2 web server.

Pointing your domain or sub-domain

It is a good practice to point your domain name or sub-domain first, before you set it up on your server which I’ll cover afterwards below, so let’s go ahead and point our domain. Whether you are using a new domain name or a sub-domain on one of your existing domain names, the process is similar for pointing the domain name or sub domain name to your server IP address. You will need to go to your domain management console and create a Type “A” record. This will normally be done in your DNS provider’s advanced DNS settings or zone file settings. Use the following settings to create two new records:

  • Name: if there is a name field, enter the domain name or sub-domain name(most require you to follow the domain with a “.” so for my sub domain I entered “subdom.jafty.com.“.
  • Type: “A” for both records.
  • Hostname field: enter “www” in the first record and “@” in the second.
  • Destination IPv4 address(sometimes just called Address): Use your server’s IP address for both records.
  • TTL: use “14400” for both records.

That should be enough information for you to figure out how to create your two host records on just about any platform, but if your platform differs, ask your provider for assistance or google the providers name followed by DNS instructions or “How to point a name with Provider Name”. You are creating two similar records, one for WWW and one for @. That way visitors of your site can access with either www.example.com or just example.com. The Hostname of @ makes the record for the domain without “www” in front of it. If your provider’s DNS settings do not include the Host or Hostname field where we put either www or @, then you probably need to create two records with different names instead. For example, name one record “example.com.” and name the other “www.example.com.”. If you’re using a sub domain then name one “sub.example.com.” and the other “www.sub.example.com.” You don’t really need a www record for sub domains usually, but you can use one if you want, it won’t hurt anything and might help some users find your site.

Steps to adding  a second domain name to your server

Here I am going to explain how I set up a sub domain as as second domain name pointing to a second website on my Linux/Apache2 web server:

Note: My first site was already set up in var/www/html. Most people prefer to set up multiple websites under the var/www directory, but to keep things simple, I’m going to use the var/www/html folder and not var/www. It really makes no difference. It’s just a preference.

  1. Create your directory structure for your new website that will reside on your new domain or sub-domain. I’m creating a sub domain like subdir.jafty.com, but these directions are the same as if I were using just jafty.com instead. First, create the directory /var/www/html/subdir.jafty.com. Then create /var/www/html/subdir.jafty.com/logs and /var/www/html/subdir.jafty.com/public_html. If you are logged into FileZilla as root, you can create these from there, otherwise log in with putty and create them using the sudo command.
  2. Create your log files. Simple make two empty files named access.log and error.log and upload them to the logs folder you created in step one above.
  3. Create a VHOSTS file named after the domain or sub-domain followed by .conf, so in my case, I’d name my file subdir.jafty.com.conf. THen copy and paste the  content below under the heading “VHOSTS Example File Contents” into it then change all instances of my sub-domain name with your own domain or sub domain and upload that file to /etc/apache2/sites-available.
  4. Next, use the a2ensite tool from the Linux command line to finalize the new site with the following command(replace example.com with your domain or sub-domain):  sudo a2ensite example.com.conf
  5. Reset apache2 with: sudo service apache2 restart

VHOSTS Example File Contents

<Directory /var/www/html/planner.jafty.com/public_html>
    Require all granted
<VirtualHost *:80>
    ServerName planner.jafty.com
    ServerAlias www.planner.jafty.com

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/planner.jafty.com/public_html

    ErrorLog /var/www/html/planner.jafty.com/logs/error.log
    CustomLog /var/www/html/planner.jafty.com/logs/access.log combined

Automating the process of setting up domain names and sub domains

If you have to do this often or alter DNS records often and create lots of virtual hosts, you should probably look into automating the process. I provide such a service and have done so for several of my clients. What I do is create a simple user interface in a secure admin web page on your own server where you can simply enter the domain name or sub domain name into a form field and press GO and it does all the above work for you! A real time saver if you have to do this more than once in a great while! IF you are interested in this service, contact me, Ian L. of Jafty.com for a fast, free quote by email or Skype. My email is linian11@yahoo.com and my Skype name is ianlin11. Or use the contact link on this site.


That is how you do it!

How to Create a WordPress Child Theme

In this tutorial we will learn a simple step by step process for creating a WordPress child theme.

Why make a child theme?

The answer is simple. We make a child theme in so we don’t mess up the main theme. Also when WordPress decides it is time to update your theme, you won’t loose all of your custom code because it will be protected inside your own child theme which isn’t effected by parent theme updates!

Tools you will need:

  1. FileZilla or another FTP application running on your desktop.
  2. Notepad++, Notepad or another plain text editor.

Step by Step Instructions for Making a WordPress Child Theme

  1. Name your child theme by appending “-child” to the name of it’s parent theme. In this example, we will make a child theme for the twentyseventeen theme, so we will name it “twentyseventeen-child”. To lock in the name, create a new folder on your desktop(right-click on desktop and select new/folder in Windows) and name it “twentyseventeen-child”.
  2. Using your text editor application, create a new file in the folder you created on your desktop in step one and name it style.css. Then copy and paste the code below under the “Style Sheet Code” heading into the twentyseventeen-child/style.css file and save it. When doing so, make sure the template: setting is set to the directory name of the parent theme.
  3. Create a second file in your twentyseventeen-child folder on your desktop named “functions.php” and copy and paste the code below under the “Functions.php Code” heading. Save it.
  4. Upload the twentyseventeen-child folder to your site’s wp-content/themes directory, activate it and check several pages of your site to make certain everything looks the same as it used to as we have not made any changes yet. See the section below entitled “Troubleshooting” if it doesn’t look exactly like the parent theme at this point or if you have any other issues.
  5. Once you have a working child theme identical to it’s parent, start modifying it! You can over-ride any file of the parent theme by including it in the child theme’s folder and altering the code.


Style Sheet Code

 Theme Name:   Twenty Seventeen Child
 Theme URI:    http://jafty.com/twenty-seventeen-child/
 Description:  Twenty Seventeen Child Theme
 Author:       Ian L. of Jafty.com
 Author URI:   http://jafty.com
 Template:     twentyseventeen
 Version:      1.0.0
 License:      GNU General Public License v2 or later
 License URI:  http://www.gnu.org/licenses/gpl-2.0.html
 Tags:         light, dark, two-columns, right-sidebar, responsive-layout, accessibility-ready
 Text Domain:  twenty-seventeen-child

Functions.php Code

function my_theme_enqueue_styles() {

    $parent_style = ‘twentyseventeen-style’; // This needs to be set to the value from the parent theme’s wp_enqueue_style line in the parent functions.php file

    wp_enqueue_style( $parent_style, get_template_directory_uri() . ‘/style.css’ );
    wp_enqueue_style( ‘child-style’,
        get_stylesheet_directory_uri() . ‘/style.css’,
        array( $parent_style ),
add_action( ‘wp_enqueue_scripts’, ‘my_theme_enqueue_styles’ );


  • Styles do not match that of parent site before making style changes. If you have this issue then it is likely that your parent theme didn’t include all of it’s styles inside of the standard style.css file. Look in the parent theme’s functions.php file and search for “wp_enqueue_style” and carefully include any other enqueued styles besides style.css into your child theme’s functions.php as well. If you copy the lines from parent to child, be certain you change “get_stylesheet_directory_uri” to “get_template_directory_uri” and it should work fine.
  • Some pics don’t show up in child theme that showed up in parent theme. If this happens, re-enable the parent theme and find the images that were not working and make a note of their URL(right click on image and click view image). The images that were not working are likely to have been included inside the parent theme, so duplicate their path inside the child theme and make a copy of the images there. For example, if the images were in twentyseventeen/assets/media/pics in the parent theme, then create those folders in the child theme like twentyseventeen-child/assets/media/pics and copy the images there as well. That’s the easy way. If you want more of a challenge and don’t want to cpy the images, find and edit the path in the code for ea. image that is not displaying.

Understanding ARIA Click Button to Show or Hide Content Example Code

Understanding ARIA

ARIA stands for “Accessible Rich Internet Applications”. Also known as the WAI-ARIA standard, it is a standard developed to help coders to provide proper semantics for custom widgets and to make them accessible, usable, and interoperable with assistive technologies for people with disabilities. To be clear, ARIA doesn’t add functionality to an object. It adds roles and states that assist in identifying the intent and state of an object. However, usually JavaScript code is still needed to add any dynamic action to that object. I state this clearly at the top of this post because at first, I was under the impression that ARIA also added certain functionalities to HTML objects and was seriously disappointed when I found out otherwise. For example, when ARIA is used on a button that hides and shows content in a div, it only defines the roles and states of the button and corresponding div. JavaScript is still needed to do that work of hiding and showing the div in question.

Example Code

Here is an example of correctly implementing ARIA controls when making a button that hides and shows a div on the click of your mouse. It also binds the space bar and enter key to the div as well, so pressing either of those keys toggles the visibility of the div as well. Without any further ado, the code:

<!DOCTYPE html>
<meta charset=”UTF-8″ />
<title>Aria Examples</title>
<script src=”https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js”></script>

div.topic {
    display: none;
    margin-bottom: 1em;
    padding: .25em;
    border: black thin solid;
    background-color: #EEEEFF;
    width: 40em;

<p class=”button”>
    <button id=”button1″ class=”buttonControl” aria-controls=”t1″ aria-expanded=”false”><span>Show</span> Topic 1</button>

<div id=”t1″ class=”topic” role=”region” tabindex=”-1″ >
    Topic 1 is all about being Topic 1 and may or may not have anything to do with other topics.

$(document).ready(function() {

   var hs1 = new hideShow(‘button1’);
  // var hs2 = new hideShow(‘button2’);
  // var hs3 = new hideShow(‘button3’);
  // var hs4 = new hideShow(‘button4’);
}); // end ready()

// function hideShow() is the constructor for a hideShow widget. it accepts the html ID of
// an element to attach to.
// @param(id string) id is the html ID of the element to attach to
// @return N/A
function hideShow(id) {

   this.$id = $(‘#’ + id);
   this.$region = $(‘#’ + this.$id.attr(‘aria-controls’));

   this.keys = {
               enter: 13,
               space: 32

   this.toggleSpeed = 100;

   // bind handlers

} // end hidShow() constructor

// Function bindHandlers() is a member function to bind event handlers to the hideShow region
// return N/A
hideShow.prototype.bindHandlers = function() {

   var thisObj = this;

   this.$id.click(function(e) {


      return false;

// Function toggleRegion() is a member function to toggle the display of the hideShow region
// return N/A
hideShow.prototype.toggleRegion = function() {

      var thisObj = this;

    // toggle the region
    this.$region.slideToggle(this.toggleSpeed, function() {

      if ($(this).attr(‘aria-expanded’) == ‘false’) { // region is collapsed

        // update the aria-expanded attribute of the region
        $(this).attr(‘aria-expanded’, ‘true’);

        // move focus to the region

        // update the button label

      else { // region is expanded

        // update the aria-expanded attribute of the region
        $(this).attr(‘aria-expanded’, ‘false’);

        // update the button label

} // end toggleRegion()

Thank you oaa-accessibility.org for providing me with enough knowledge to create and use the above example! They have the best example code for ARIA usage that I could find online after many Google searches. See their complete list of example ARIA examples at http://oaa-accessibility.org/

ARIA and WordPress

I noticed ARIA controls for the first time in the header.php file for my WordPress theme. I was trying to fix a mobile navigation menu and thought couldn’t find the code that makes the menu appear on mobile devices when the button is clicked and thought ARIA had something to do with it. I was basically wrong. ARIA code was only present to mark the navigation menu and make it’s role and states readily accessible. It is after all an accessibility feature.


So ARIA and the WAI-ARIA standard are used to enable more accessible HTML markup for disabled people. While it is a great initiative, it doesn’t add much dynamic functionality to your HTML objects, JavaScript is still needed for that. ARIA combined with HTML, CSS and JavaScript can be used to make accessible web pages more user-friendly.