Tutorial: Preparing a WordPress site for Git using WP Bootstrap

There are a lot of tutorials around about how to use Git to manage WordPress installations. While they are almost all very good, many of these tutorials encourage a work flow that works great for code but less than great, or not at all, for WordPress content. While most content in a WordPress site is just posts, comments and images some of the content is actually more important. Besides code, your WordPress site is also made up of menus, pages, widgets and options to work and look as you designed it, and in WordPress, most of that is also content. So we need an improved way of managing “application content” as opposed to “content content” to be able to maintain a good development work flow with Git.

In this tutorial, we’re going to go through all steps needed to setup a simple WordPress one-page site using WP Bootstrap as the main tool for migrating content. Since the site is created using WP Bootstrap, it’s also extremely easy to manage under Git source code control and to migrate it to a production environment. This text assumes that you have a basic understanding about Vagrant and some experience from a Linux command line will not hurt either. This text also assumes that you’re working on a Mac on Linux computer rather than Windows. Most commands will work the same on Windows, but please note that the author hasn’t tested.

Overview

We’re going to cover a few different areas.

  • First we’re going to create a Vagrant machine that we use as the development environment.
  • In the Vagrant machine, we’ll work with wp-cli, composer and WP Bootstrap which are our main tools to build up the site.
  • We will walk through how to modify appsettings.json, the main WP Bootstrap configuration file, to include just the parts of the content we want to manage using WP Bootstrap and show how export that content.
  • At last, we’ll re-import this content to an empty WordPress installation to verify that the process works as intended.

As the end result, we’re going to have a Git manageable WordPress site that takes content into account.

Step 1: Creating the Vagrant machine

Note: This guide does not aim to specifically teach anything about setting up and using Vagrant. If you want to read up on the basics of developing WordPress sites on top of Vagrant, please read this post. By the way, the rest of this text assumes that you have the vagrant plugin vagrant-hostupdater installed, as described in the linked post.

The first thing we’re going to do is to download a suitable Vagrant skeleton configuration. We’re going to use a derivative of Varying Vagrant Vagrants (vvv) with a little simplified setup that I’ve made available on Github. Open a terminal window and navigate to the folder where you keep your source code, the actual project folder will be created as part of this step, so don’t create that manually.

Get the zip, unzip it and rename the

$ wget https://github.com/eriktorsner/vagrant-wpskeleton/archive/master.zip
$ unzip master.zip
$ mv vagrant-wpskeleton-master/ casestudy1
$ rm -rf master.zip
$ cd casestudy1/

Navigate into the newly created folder casestudy1 and open the file Vagrantfile in your favorite text editor, you need to modify the four parameters in that file to suit this project (note that you might need to use a different IP depending on your Vagrant network settings):

 
# -*- mode: ruby -*-
# vi: set ft=ruby :

HOSTNAME = 'case1'
IPNUMBER = '192.168.50.38'
DEVDNS   = 'www.casestudy1.local'
TESTDNS  = 'test.casestudy1.local'

dir = Dir.pwd
require dir + '/vagrant/Vagrant'

Save the file and go back to the command line to type

$ vagrant up

This command might take a little while, up to 10 minutes is normal. First it will download the correct Ubuntu 14.04 LTS image and then it installs wp-cli, composer and some other tools. Once it’s finished, you can enter your newly created Vagrant machine:

$ vagrant ssh

 

Step 2: Install and configure WP Bootstrap

Note: From now on, unless stated otherwise, all bash commands shown should be executed from the /vagrant sub folder inside the virtual machine.

Once your inside the virtual machine, navigate to the /vagrant sub folder, install and initiate WP Bootstrap:

$ cd /vagrant
$ composer require eriktorsner/wp-bootstrap
$ vendor/bin/wpbootstrap wp-init-composer
$ composer wp-init

Note: The /vagrant sub folder inside the virtual machine is shared with the project folder on your normal hard drive, so you can edit files using your favorite text editor or IDE. This is one of the main advantages of using a Vagrant machine as development environment, you’ll use your standard set of tools to work with the code, but then the code runs inside a separate environment where you can install project specific things such as WP Bootstrap.

The last command above, wp-init, is a convenient command that creates template files for localsettings.json and appsettings.json. Those two files controls most of WP Bootstraps behavior so it’s nice get templates added. The file localsettings.json is used to keep settings that is specific to this machine, you’ll create a unique localsettings file for each different environment and you typically don’t want to maintain it in git. We need to edit localsettings.json to suit this machine and since we are using a standard Vagrant image we just use the mysql database created by default during the Vagrant provisioning. Edit localsettings.json:

{
	"environment": "development",
	"url": "www.casestudy1.local",
	"dbhost": "localhost",
	"dbname": "wordpress",
	"dbuser": "wordpress",
	"dbpass": "wordpress",
	"wpuser": "admin",
	"wppass": "admin",
	"wppath": "/vagrant/www/wordpress-default"
}

and appsettings.json to this:

{
	"title": "Case study 1"
}

Then we can get a very basic WordPress install up and running with a few commands:

$ composer wp-install
$ composer wp-setup

 

After a few minutes, you should be able to log in to your WordPress site using the url: http://www.casestudy1.local/wp-admin and login with username: admin and password: admin (don’t worry, your live site will not use these credentials, they are only used in development).

As a last preparation before moving on, we’re going to create a snapshot of what the WordPress options looks like right now for future reference using wp-cli. So before running the command, we’ll create a wp-cli settings file to reduce typing:

$ echo "path: /vagrant/www/wordpress-default" > wp-cli.yml
$ wp option list > opt.initial.snapshot

 

Step 3: Add plugins and a theme

This test site is going to use a free theme from the WordPress repository as well as a few free plugins. We’ll add them by editing appsettings.json and run the wp-setup command again. Open appsettings.json and change it to:

{
    "title": "Casestudy1",
    "themes": {
        "standard": ["vantage"],
        "local": ["vantage-child"],
        "active": "vantage-child"
    },
    "plugins": {
        "standard": [
            "ml-slider", "siteorigin-panels", "so-widgets-bundle",
            "wp-cfm"
        ]
    }
}

What does these things mean? Well, this json file contains different sections describing various aspects of the WordPress installation we’re creating:

  • title: This was added earlier and is simply the title for the WordPress site. This is the only mandatory property of appsettings.json since WordPress needs have a title to install and initialize. The other properties that are strictly needed, such as website url and admin username are defined in localsettings.json.
  • themes: this property is a json object with a few subproperties
    • standard: this is a list (array) of plugin slugs that will be installed from the WordPress standard theme repository. If you need, you can also specify a specific version using a colon, like this “vantate:1.0.2”
    • local: this is a list of themes that exist locally under “wp-content/themes” in your project folder. This is suitable if you’re using a premium theme that can’t be downloaded from the WordPress repo or as we’re going to do, use a local child-theme. The folder name needs to match the string supplied here, so for the above configuration, WP Bootstrap expects to find a folder named /path/to/your/project/wp-content/themes/vantage-child. Note that the folder will be sym-linked to the wp-content/themes folder in the actual WordPress installation (specified in localsettings.json).
    • active: a string that specifies the theme that should be activated, in this case, the child theme
  • plugins: This structure is very similar to the themes structure, but there isn’t any “active” property, all plugins are activated after install
    • standard: this is a list (array) of plugin slugs that will be installed from the WordPress standard plugin repository. If you need, you can also specify a version using a colon, like this “wp-cfm:1.0.2”. A URL to a zip file is also acceptable, this can be useful if you want to install a plugin directly from a git repo for instance
    • local: this is a list of plugins that exist locally under “wp-content/plugins” in your project folder. This is suitable if you’re using a premium plugin or plugins that you develop specifically for this particular site and that will be kept in git.

Before we can apply these settings to our WordPress installation, we need to create the child theme folder and place a minimal child theme in there.

$ mkdir -p wp-content/themes/vantage-child
$ touch wp-content/themes/vantage-child/style.css
$ touch wp-content/themes/vantage-child/functions.php

 

Open wp-content/themes/vantage-child/style.css in your favorite text editor and add the following content:

/*
 Theme Name:   Vantage-child
 Template:     vantage
*/

 

…and open wp-content/themes/vantage-child/functions.php and add the following:

<?php

add_action('wp_enqueue_scripts', 'theme_enqueue_styles');

function theme_enqueue_styles()
{
    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'));
}

 

Once both files are saved, we can go ahead and apply the changes using the command:

$ composer wp-setup

The first time this command runs, there’s not much output at all but it might take a minute or two depending on your Internet download speed. Once done, you can surf to http://www.casestudy1.local/ and you’ll see the Vantage theme default screen:

 

Vantage default look

Log in to the WordPress admin area and go to the plugins section, you should see that the plugins we specified in appsettings.json are all installed and activated:

List of plugins

 

At this point, we have created a WordPress site with the theme and plugins of our liking simply by creating a couple of configuration files,

  • composer.json used for installation of WP Bootstrap
  • localsettings.json that configures some server specific things like passwords and paths
  • appsettings.json than configures themes and plugins we want to use, both from the repo and local to our hard drive

So what we have done so far is to create a text file based configuration for installing WordPress and a couple of plugins, just in a format well suited for managing in Git.

Step 4: Creating content

For this step, we’re going to work mostly inside the WordPress admin area. We’re going to create a front page slider with the Meta Slider plugin and then set up a welcome page that uses that slider and some additional content.

Create the slider

Go to the Meta Slider settings and create a new slider and add a single image slide to it. The on screen instructions should be easy to follow, set the name “welcome” to the slider and set a caption for the image.

Meta slider

Create the Welcome page

Next, to go Pages->Add new to create a page. Give it the title “Welcome”.

Set a title

Select the Full Width Page template in the meta box on the right hand side. The theme we’ve selected has an option to select a Meta Slider as a page option and in that drop down, you should see the welcome-slider that we’ve just created. Then hit publish to save the page for the first time.

Selection_358

The next step is to add some content using Page builder. Add a row with 3 columns and add a text widget to each of them. Place some dummy text in them and Update the page. The Page Builder view on the edit page should look something like this:

Page builder

Next, we’ll head to Settings -> Reading in the WordPress admin area to make our new page the front page of the site:

Settings -> Reading

Click Save changes and then head to Appearance -> Theme Settings. Note that this is a menu option that is specific for this theme, so don’t expect to see this if you’re testing this with a different theme. We want to remove the default “Header text” and menus:

Vantage Theme Settings

Vantage Theme settings pt2

Scroll down to the settings page and click Save Settings. We can now have a look at the test website, it should look something like this:

Case study test site

 

Step 5: Exporting content

We’ve now got a reasonably standard WordPress site with some added content and modified settings. Our next task is to make some additions to appsettings.json so that it can export all the content we’re interested in. Options that we’ve changed in the WordPress admin area will be stored to disk by setting up the WP-CFM plugin and we’re also going to add two new sections to appsettings.json:

  • content: The content section lists post types and individual posts that we want to include in the export. We’ll also be listing some taxonomies.
  • references: The references section is when the content is imported back into a WordPress site. In various places in the content, there are data items that refer to posts or taxonomy terms by the internal ID. If we can successfully tell WP Bootstrap which settings to treat as references, the import process will be able to restore those references during import.

But lets start with WP-CFM. Go to Settings -> WP-CFM in the WordPress admin area and click Add Bundle.  Name the bundle wpbootstrap and click the Save button. You should now see a lot of unchecked boxes, each box representing an option that is stored in the wp_options table:

WP-CFM settings

Identifying exactly which options to include is a separate, and quite big, topic, for now, we’re just going to add the options that matters (the most) in this specific installation. Most options in the wp_options table just get a default value and in most cases, it’s perfectly OK to let the target WordPress installation (where we’lll eventually import these settings) to set it’s own default values. For this tutorial, we’re going to be as lean as possible and only include values that we really need, namely these three:

  • vantage_theme_settings All theme options that we edited in step 4 above are stored in this single option.
  • show_on_front This is the WordPress option that determines if the first page is a static page or a list of recent blog posts, we’ve changed this option so we need to include it.
  • page_on_front WordPress keeps track of the post ID of the page that is set as our front page, we’ve set the “Welcome” page as our front page, so this setting needs to be exported

 

Find and mark each of these options in the WP-CFM settings page and click save.

The next thing we’ll do is add what posts to include in the export. For this, we’ll edit appsettings.json directly. To figure out what pages (and post types) to include, we’re going to use wp-cli to display what our installation has. First of all, we want to include the welcome page. We could just be lazy and include all pages, or we can be explicit and only include the page we know we want. First, list all pages using wp-cli at the Vagrant command line:

$ wp post list --post_type=page
+----+-------------+-------------+---------------------+-------------+
| ID | post_title  | post_name   | post_date           | post_status |
+----+-------------+-------------+---------------------+-------------+
| 6  | Welcome     | welcome     | 2015-12-29 17:24:30 | publish     |
| 2  | Sample Page | sample-page | 2015-12-27 22:25:16 | publish     |
+----+-------------+-------------+---------------------+-------------+

We’re going to be explicit and only include the page we’ve worked with, so the resulting appsettings.json becomes:

{
    "title": "Casestudy 1",
    "themes": {
        "standard": ["vantage"],
        "local": ["vantage-child"],
        "active": "vantage-child"
    },
    "plugins": {
        "standard": [
            "ml-slider", "siteorigin-panels", "so-widgets-bundle",
            "wp-cfm"
        ]
    },
    "content": {
        "posts": {
            "page": ["welcome"]
        }
    }
}

For reference, if we had wanted to include all pages, we could have used:

// lazy: include all posts with post-type = page
"posts": {
    "page": "*"
}

 

The plugin Meta Slider stores it’s sliders as posts with custom post type ml-slider. To figure this out, we can see what post types this installation has:

$ wp post-type list
+---------------+-----------------------+-------------+--------------+--------+-----------------+
| name          | label                 | description | hierarchical | public | capability_type |
+---------------+-----------------------+-------------+--------------+--------+-----------------+
| post          | Posts                 |             |              | 1      | post            |
| page          | Pages                 |             | 1            | 1      | page            |
| attachment    | Media                 |             |              | 1      | post            |
| revision      | Revisions             |             |              |        | post            |
| nav_menu_item | Navigation Menu Items |             |              |        | post            |
| ml-slider     | Meta Slider           |             |              | 1      | post            |
+---------------+-----------------------+-------------+--------------+--------+-----------------+

 

If you know your way around WordPress, you should quickly see that the type ml-slider is non standard. Let’s see what posts we have with that type:

$ wp post list --post_type=ml-slider
+----+------------+------------+---------------------+-------------+
| ID | post_title | post_name  | post_date           | post_status |
+----+------------+------------+---------------------+-------------+
| 4  | welcome    | new-slider | 2015-12-29 17:14:12 | publish     |
+----+------------+------------+---------------------+-------------+

The only post with type ml-slider has title welcome and post_name=new_slider and this matches with how we named the slider we created in step 4. When we define what posts to include in an export, we want to use the post_name as the identifier, to adding the slider to the exported content:

{
    "title": "Casestudy 1",
    "themes": {
        "standard": ["vantage"],
        "local": ["vantage-child"],
        "active": "vantage-child"
    },
    "plugins": {
        "standard": [
            "ml-slider", "siteorigin-panels", "so-widgets-bundle",
            "wp-cfm"
        ]
    },
    "content": {
        "posts": {
            "page": ["welcome"]
            "ml-slider": ["new-slider"]
        }
    }
}

 

When we just add an image to a page or post, WP Bootstrap is usually able to identify what media files to include in the export because it can be figured out by analyzing the post itself. But in this case, the image we added to the slider is not really attached to the page, it rather “belongs” to the slider. Since any image could potentially be included to more than one slider, the authors of Meta Slider is using a taxonomy (special kind of category) to tie the image to a slider. Because of this WP Bootstrap can’t figure out that the image needs to be included and we need to include the image separately. Internally, media files are just posts with the post type attachment:

$ wp post list --post_type=attachment
+----+-------------+-------------+---------------------+-------------+
| ID | post_title  | post_name   | post_date           | post_status |
+----+-------------+-------------+---------------------+-------------+
| 5  | camera-1080 | camera-1080 | 2015-12-29 17:14:48 | inherit     |
+----+-------------+-------------+---------------------+-------------+

So we’re going to and add this single attachment to appsettings.json:

{
    "title": "Casestudy 1",
    "themes": {
        "standard": ["vantage"],
        "local": ["vantage-child"],
        "active": "vantage-child"
    },
    "plugins": {
        "standard": [
            "ml-slider", "siteorigin-panels", "so-widgets-bundle",
            "wp-cfm"
        ]
    },
    "content": {
        "posts": {
            "page": ["welcome"]
            "ml-slider": ["new-slider"],
            "attachment": ["camera-1080"]
        }
    }
}

As mentioned above, Meta Slider uses a taxonomy to tie the image to the slider, let’s look at what taxonomies we have:

$ wp taxonomy list
+---------------+------------------+-------------+---------------+---------------+--------------+--------+
| name          | label            | description | object_type   | show_tagcloud | hierarchical | public |
+---------------+------------------+-------------+---------------+---------------+--------------+--------+
| category      | Categories       |             | post          | 1             | 1            | 1      |
| post_tag      | Tags             |             | post          | 1             |              | 1      |
| nav_menu      | Navigation Menus |             | nav_menu_item |               |              |        |
| link_category | Link Categories  |             | link          | 1             |              |        |
| post_format   | Format           |             | post          |               |              | 1      |
| ml-slider     | Categories       |             | attachment    |               | 1            |        |
+---------------+------------------+-------------+---------------+---------------+--------------+--------+

Again, if you know your way around WordPress, you’ll notice that the ml-slider taxonomy is a non standard taxonomy and it also say that it’s linking to object_type=attachment, so we know that’s the one we need to export. Normally when we add taxonomies to the WP Bootstrap appsettings.json, we can just specify it’s name like this if we want to export all terms in a taxonomy:

{
    "title": "Casestudy 1",
    "themes": {
        "standard": ["vantage"],
        "local": ["vantage-child"],
        "active": "vantage-child"
    },

    "plugins": {
        "standard": [
            "ml-slider", "siteorigin-panels", "so-widgets-bundle",
            "wp-cfm"
        ]
    },
    "content": {
        "posts": {
            "page": ["welcome"],
            "ml-slider": ["new-slider"],
            "attachment": ["glasses_coffee"]
        },
        "taxonomies": {
            "ml-slider": "*"
        }
    }
}

The above would cause WP Bootstrap to include any term in the taxonomy “ml-slider” in the export. During import, the taxonomy would be imported with it’s slug as the unique identifier. If a taxonomy term already exists with the same slug, WP Bootstrap would update that term, but if it didn’t exist, WP Bootstrap would create it. However, Meta Slider taxonomies are a little different. When a slider is created, a new taxonomy term is created with the slide post id as the name and slug. We saw above that our slider had post id = 4, so Meta Slider would have created a term with the name/slug = 4. This presents a little problem during import because there’s no guarantee that the slider will get id=4 on the target site so a taxonomy term with the name/slug 4 would be useless. We need to instruct WP Bootstrap to treat this taxonomy a little different. Instead of specifying an asterisk (string) or an array similar to the posts, we’re specifying it as an object with some properties, like this:

    "taxonomies": {
        "ml-slider": {
            "type": "postid",
            "termDescriptor": "*"
        }
    }

The resulting appsettings.json now becomes:

{
    "title": "Casestudy 1",
    "themes": {
        "standard": ["vantage"],
        "local": ["vantage-child"],
        "active": "vantage-child"
    },

    "plugins": {
        "standard": [
            "ml-slider", "siteorigin-panels", "so-widgets-bundle",
            "wp-cfm"
        ]
    },
    "content": {
        "posts": {
            "page": ["welcome"],
            "ml-slider": ["new-slider"],
            "attachment": ["glasses_coffee"]
        },
        "taxonomies": {
            "ml-slider": {
                "type": "postid",
                "terms": "*"
            }
        }
    }
}

 

Now, we have one last thing to do before we’re finished with appsettings.json and that is to define references. There are two post references in this site that matters, but we only need to take one of them into account. The first one is the page_on_front setting that we mentioned earlier. Since this is a standard WordPress setting, WP Bootstrap is already aware of it and we don’t need to specify it. The second one is slightly trickier, the welcome page has a reference to the ml-slider post. Since Vantage theme lets us specify what slider to use on a page as a separate setting, there’s bound to be a reference to it somewhere and it’s by definition a reference to a post (we already know that a slider is just a post with post type “ml-slider”). To figure out the name of this setting, go to the WordPress admin area to edit the Welcome page. At the top of the screen, you can enable to see custom fields by clicking the Screen options and marking the correct checkbox:

Showing custom fields

Scroll down the page to the custom fields section, now we’re able to see all custom fields on this post.

custom fields

As you can see, there’s a field named “vantage_metaslider_slider” that has the value “meta:4”. This is a row in the WordPress table wp_postmeta with a reference to the ml-slider post with id=4. To add this to our appsettings.json, we need to add a references section:

{
    "title": "Casestudy 1",
    "themes": {
        "standard": ["vantage"],
        "local": ["vantage-child"],
        "active": "vantage-child"
    },
    "plugins": {
        "standard": [
            "ml-slider", "siteorigin-panels", "so-widgets-bundle",
            "wp-cfm"
        ]
    },
    "content": {
        "posts": {
            "page": ["welcome"],
            "ml-slider": ["new-slider"],
            "attachment": ["glasses_coffee"]
        },
        "taxonomies": {
            "ml-slider": {
                "type": "postid",
                "termDescriptor": "*"
            }
        }
    },
    "references": {
        "posts": {
            "postmeta": ["vantage_metaslider_slider"]
        }
    }
}

There are a few ways to add information about references to WP Bootstrap, in this case we’re telling WP Bootstrap that there is a postmeta field named “vantage_metaslider_slider” and that it points to a post. We’re basically telling WP Bootstrap that whenever it comes across a postmeta field with this name, it contains an integer that’s a reference to a post id. During import, WP Bootstrap should look up what id that post has in the new site and change the value so that it points to the correct post id. We also saw that the content of this field was not an integer but a string (meta:4). WP Bootstrap can handle this fine just as long as the string doesn’t get too complicated.

With that last piece in place, we’re all done with appsettings.json and can perform the actual export:

$ composer wp-export

You now have a file based representation of your WordPress site in the sub folder bootstrap/ with the following structure:

bootstrap/
├── config/
├── manifest.json
├── media/
|   ├── camera-1080/
├── posts/
│   ├── attachment/
│   ├── ml-slider/
│   └── page/
└── taxonomies/
    └── ml-slider

Together with the appsettings.json file and the projects wp-content folder,  the bootstrap folder is all you need to check in to keep this site managed under Git. Using a workflow combining git commands and WP Bootstrap the relevant parts of the WordPress site can be migrated to a staging or production environment with ease. References between WordPress objects will be preserved on import. When importing this content to another WordPress installation, WP Bootstrap will not touch anything that’s not defined or described in the data we’re bringing, any other posts, pages, comments that exist on the target installation will remain untouched which is the whole point with WP Bootstrap.

Step 6: Putting it to the test

Since we now have a file based representation of our site we’re able to put WP Bootstrap to the test. Let’s destroy the actual site and try the wp-import command. If we’ve gotten everything correct, we should get our site back just as it looked before we destroyed it.

To begin with, WP Bootstrap has a command to completely wipe a WordPress installation, since it’s a bit dangerous it’s not automatically mapped as a composer script. Instead, we need to call the wpbootstrap binary directly:

$ vendor/bin/wpbootstrap wp-reset

This will command will drop all the WordPress tables from the database and forefully delete every single file in the WordPress folder defined in localsettings.json. Powerful but dangerous. Surf to http://www.casestudy1.local/ just to verify that your WordPress installation is indeed gone, you should see a 403 Forbidden message from Nginx.

Next, run the commands to install WordPress, set it up with the right theme and plugins and lastly import content and settings again.

$ composer wp-install
$ composer wp-setup
$ composer wp-import

After these three commands, go back and check http://www.casestudy1.local/ again, your WordPress installation should be back as it were before it was deleted. If you want to play around with WP Bootstrap a bit, an interesting exercise is to reset the installation, run wp-install and wp-setup  to get it back. But before the wp-import command, go ahead and add some pages and posts to make sure the database id’s on the imported posts are different than they were in the initial install.

Conclusions and next steps

Creating a site using WP Bootstrap requires some additional steps compared to the WordPress famous 5 minute install even if it should still be quite possible to do it in under 5 minutes. But the major benefit of using this method is not so that time can be saved at first install but at the long term advantages you’ll get. Now we have a WordPress site that can be installed and configured using a few commands at the terminal, even if that’s been possible to do using wp-cli alone for quite some time, we’re also managing the (important) content. And the content itself is in a format that is suitable for Git and contains just enough meta data for it to be portable between WordPress installations. It’s the foundation for a solid workflow.

The next natural step to go to from here is to add your website to a Git repository.  First, we need to create a .gitignore file with (at least) the following:

.vagrant/
vendor/
www/
localsettings.json

 

Then the following files and folders should be added to Git:

bootstrap/
wp-content/
.gitingore
appsettings.json
composer.json

 

After checkout in the staging or production environment, you can create the initial site using:

$ composer update
$ composer wp-install
$ composer wp-setup
$ composer wp-import

 

When making changes to the original Vagrant installation (your development environment), you check in all changes to git, then back in the staging or production environment, you’d just perform a few commands to get all the changes:

$ git pull
$ composer wp-setup
$ composer wp-import

 

A final note

WP Bootstrap is currently at version 0.3.1, a lot of features are already implemented, but bugs exist and a lot of features simply aren’t implemented yet. If you decide to use WP Bootstrap in a production environment, it’s because you are an early adopter and are prepared to spend lots of time fix potentially large and complicated issues manually. If you don’t feel like an early adopter or if you can’t risk to mess up a deployment, please refrain from using WP Bootstrap in production environment until the package is a bit more mature.

Questions? Concerns? Angry? Happy? Let me know in the comments section below.

Leave a Reply

Your email address will not be published. Required fields are marked *