Install WordPress using bash shell without visiting /wp-admin/install.php?

I wrote this little BASH script that creates a folder,unzips WordPress and creates a database for a site.

The final step is actually installing WordPress, which usually involves pointing your browser to install.php and filling out a form in the GUI.

Read More

I want to do this from the BASH shell, but can’t figure out how to invoke wp_install() and pass it the parameters it needs:

-admin_email
-admin_password
-weblog_title
-user_name

(line 85 in install.php)

Here’s a similar question, but in python

#!/bin/bash

#ask for the site name
echo "Site Name:"
read name
# make site directory under splogs
mkdir /var/www/splogs/$name
dirname="/var/www/splogs/$name"
#import wordpress from dropbox
cp -r  ~/Dropbox/Web/Resources/Wordpress/Core $dirname
cd $dirname
#unwrap the double wrap
mv Core/* ./ 
rm -r Core
mv wp-config-sample.php wp-config.php 
sed -i 's/database_name_here/'$name'/g' ./wp-config.php
sed -i 's/username_here/root/g' ./wp-config.php
sed -i 's/password_here/mypassword/g' ./wp-config.php
cp -r ~/Dropbox/Web/Resources/Wordpress/Themes/responsive $dirname/wp-content/t$
cd $dirname

CMD="create database $name"
mysql -uroot -pmypass -e "$CMD"

How do I alter the script to automatically run the installer without the need to open a browser?

Related posts

Leave a Reply

4 comments

  1. Check out wp-cli, based on Drush for Drupal.

    wp core install --url=url --title=site-title [--admin_name=username] --admin_email=email --admin_password=password
    

    All commands:

    wp core [download|config|install|install_network|version|update|update_db]
    wp db [create|drop|optimize|repair|connect|cli|query|export|import]
    wp eval-file
    wp eval
    wp export [validate_arguments]
    wp generate [posts|users]
    wp home
    wp option [add|update|delete|get]
    wp plugin [activate|deactivate|toggle|path|update|uninstall|delete|status|install]
    wp post-meta [get|delete|add|update]
    wp post [create|update|delete]
    wp theme [activate|path|delete|status|install|update]
    wp transient [get|set|delete|type]
    wp user-meta [get|delete|add|update]
    wp user [list|delete|create|update]
    
  2. I was having the same problem as you are. I tried Victor’s method and it didn’t quite work.
    I made a few edits and it works now!
    You have to add php tags inside of the script to make the code work, otherwise it just echoes to the terminal.

    My script directly calls the wp_install function of upgrade.php, bypassing install.php completely (no edits to other files required).

    I made my script named script.sh, made it executable, dropped it in the wp-admin directory, and ran it from the terminal.

    #!/usr/bin/php
    <?php
    
    function get_args()
    {
            $args = array();
            for ($i=1; $i<count($_SERVER['argv']); $i++)
            {
                    $arg = $_SERVER['argv'][$i];
                    if ($arg{0} == '-' && $arg{1} != '-')
                    {
                            for ($j=1; $j < strlen($arg); $j++)
                            {
                                    $key = $arg{$j};
                                    $value = $_SERVER['argv'][$i+1]{0} != '-' ? preg_replace(array('/^["']/', '/["']$/'), '', $_SERVER['argv'][++$i]) : true;
                                    $args[$key] = $value;
                            }
                    }
                    else
                            $args[] = $arg;
            }
    
            return $args;
    }
    
    // read commandline arguments
    $opt = get_args();
    
    define( 'WP_INSTALLING', true );
    
    /** Load WordPress Bootstrap */
    require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );
    
    /** Load WordPress Administration Upgrade API */
    require_once( dirname( __FILE__ ) . '/includes/upgrade.php' );
    
    /** Load wpdb */
    require_once(dirname(dirname(__FILE__)) . '/wp-includes/wp-db.php');
    
    $result = wp_install($opt[0], $opt[1], $opt[2], false, '', $opt[3]);
    ?>
    

    I called the file like this: # ./script.sh SiteName UserName email@address.com Password

  3. Maybe you need to modify the WordPress original installer a bit.

    First, create a wrapper php CLI script, let’s say its name is wrapper.sh:

    #!/usr/bin/php -qC
    
    function get_args()
    {
            $args = array();
            for ($i=1; $i<count($_SERVER['argv']); $i++)
            {
                    $arg = $_SERVER['argv'][$i];
                    if ($arg{0} == '-' && $arg{1} != '-')
                    {
                            for ($j=1; $j < strlen($arg); $j++)
                            {
                                    $key = $arg{$j};
                                    $value = $_SERVER['argv'][$i+1]{0} != '-' ? preg_replace(array('/^["']/', '/["']$/'), '', $_SERVER['argv'][++$i]) : true;
                                    $args[$key] = $value;
                            }
                    }
                    else
                            $args[] = $arg;
            }
    
            return $args;
    }
    
    // read commandline arguments
    $opt = get_args();
    
    require "install.php";
    

    This will allow you to invoke the script from the command line, and pass arguments to it directly into the $opt numeric array.

    You can then pass the needed vars in a strict order you define, for instance:

    ./wrapper.sh <admin_email> <admin_password> <weblog_title> <user_name>

    In the install.php you need to change the definition of the before mentioned vars, as it follows:

    global $opt;
    
    $admin_email = $opt[0];
    $admin_password = $opt[1];
    $weblog_title = $opt[2];
    $user_name = $opt[3];
    

    Then let the install script do its job.

    This is an untested method, and also very open to any modifications you need. It’s mainly a guideline for using a wrapper php/cli script to define the needed variable w/out having to send them via a HTTP REQUEST / query string. Maybe it’s rather a weird way to get things done, so please, feel free to give any constructive/destructive feedback 🙂

  4. It’s incredible how little discussion there is on this topic. I think it’s awesome that WP-CLI was released and now acquired by Automattic, which should help to keep the project going long-term.

    But relying on another dependency is not ideal, esp. when dealing with automated deployment…

    This is what we came up with for SlickStack

    First, we save a MySQL “test” query and grep for e.g. wp_options as variables:

    QUERY_PRODUCTION_WP_OPTIONS_EXIST=$(mysql --execute "SHOW TABLES FROM ${DB_NAME} WHERE Tables_in_${DB_NAME} LIKE '${DB_PREFIX}options';")
    GREP_WP_OPTIONS_STRING_PRODUCTION=$(echo "${QUERY_PRODUCTION_WP_OPTIONS_EXIST}" | grep --no-messages "${DB_PREFIX}"options)
    

    …doing it this way helps to avoid false positives like when queries/grep might spit out warnings etc.

    And the if statement that will populate the WordPress database conditionally:

    ## populate database if wp_options not exists ##
    if [[ -z "${GREP_WP_OPTIONS_STRING_PRODUCTION}" ]]; then
        /usr/bin/php -qCr "include '/var/www/html/wp-admin/install.php'; wp_install('SlickStack', '"${SFTP_USER}"', '"${SFTP_USER}"@"${SITE_DOMAIN_EXCLUDING_WWW}"', 1, '', "${SFTP_PASSWORD}");"
    fi
    

    The -q keeps it quiet to avoid parsing conflicts and the -r tells it to execute the following code. I’m pretty sure we don’t really need the -C flag here, but I added it anyways just in case.

    Note: I had to play around with the if statement a few times, because the wp_install array is sensitive and I found that wrapping the password variable in single quotes resulted in a broken MD5 hash code, so if any issues try adding/removing quotation marks…