Install & Configure Apache, PHP, JSP, Ruby on Rails, MySQL, PHPMyAdmin & WordPress on Windows XP/2000



WordPress requires PHP and MySQL. On the WordPress download page, click on "Download .zip".

Version: 1.5.2
File Name:
Download Location:

Wordpress 2.0 installation instructions are also available.


  1. Unzip to your DocumentRoot directory.

    Note: If you want the WordPress blog to be the main site, put the contents of the "wordpress" directory directly into the DocumentRoot directory. Otherwise, create a subdirectory. For this guide, we put into C:\Program Files\Apache Group\Apache2\htdocs\wordpress

    Unzip wordpress
  2. We need to create a database for WordPress to use.
    1. Open http://localhost/phpmyadmin.
    2. Enter a database name (e.g. "wordpress") and click Create.
      create new database
    3. Click the "Home" icon (home icon), and then click Privileges .
    4. Click Add a new User Add a new User.
    5. Fill in the login information and then click Go.

      Note: This user will be wordpress itself. I use "wordpress" as the user name.

      Fill in the information
    6. Under "Database-specific privileges", select wordpress from the dropdown.
      select wordpress
    7. Click "Check All", and then click Go.
      Click Check All, and then click Go.
  3. In the wordpress directory, create a copy of the wp-config-sample.php file and rename it to wp-config.php. Make the following changes:

    Line 4 - This is the same username you just created above.
    define('DB_USER', 'wordpress');

    Line 5 - This is the password used.
    define('DB_PASSWORD', 'password');

  4. If you have MySQL 4.1, you may skip this step. This step is for MySQL 5 users only.

    The reason for this step is a result of MySQL 5 actually enforcing "NOT NULL" conditions on the database. There's actually a flaw in the WordPress setup script which attempts to add a record without filling in a required field. MySQL 4 let users (including WordPress) get away with it. If you want to avoid the hassle, go back to MySQL 4.1. If you wish to use WordPress with MySQL 5, continue with this step. :)

    For MySQL 5, to get around the issue, you'll need to replace the upgrade-schema.php file inside the wp-admin directory with the following:

    Note: All I really did was replace "NOT NULL default" with "default NULL", and "text NOT NULL" with "text". Thanks to a post in the WordPress forum.

    // Here we keep the DB structure and option values

    $wp_queries="CREATE TABLE $wpdb->categories (
    cat_ID bigint(20) NOT NULL auto_increment,
    cat_name varchar(55) default NULL,
    category_nicename varchar(200) default NULL,
    category_description longtext,
    category_parent int(4) NOT NULL default '0',
    PRIMARY KEY (cat_ID),
    KEY category_nicename (category_nicename)

    CREATE TABLE $wpdb->comments (
    comment_ID bigint(20) unsigned NOT NULL auto_increment,
    comment_post_ID int(11) NOT NULL default '0',
    comment_author tinytext,
    comment_author_email varchar(100) default NULL,
    comment_author_url varchar(200) default NULL,
    comment_author_IP varchar(100) default NULL,
    comment_date datetime NOT NULL default '0000-00-00 00:00:00',
    comment_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',
    comment_content text,
    comment_karma int(11) NOT NULL default '0',
    comment_approved enum('0','1','spam') NOT NULL default '1',
    comment_agent varchar(255) default NULL,
    comment_type varchar(20) default NULL,
    comment_parent int(11) NOT NULL default '0',
    user_id int(11) NOT NULL default '0',
    PRIMARY KEY (comment_ID),
    KEY comment_approved (comment_approved),
    KEY comment_post_ID (comment_post_ID)

    CREATE TABLE $wpdb->linkcategories (
    cat_id bigint(20) NOT NULL auto_increment,
    cat_name tinytext,
    auto_toggle enum('Y','N') NOT NULL default 'N',
    show_images enum('Y','N') NOT NULL default 'Y',
    show_description enum('Y','N') NOT NULL default 'N',
    show_rating enum('Y','N') NOT NULL default 'Y',
    show_updated enum('Y','N') NOT NULL default 'Y',
    sort_order varchar(64) NOT NULL default 'rand',
    sort_desc enum('Y','N') NOT NULL default 'N',
    text_before_link varchar(128) NOT NULL default '
    2. ',
    text_after_link varchar(128) NOT NULL default '
    text_after_all varchar(128) NOT NULL default ' ',
    list_limit int(11) NOT NULL default '-1',
    PRIMARY KEY (cat_id)

    CREATE TABLE $wpdb->links (
    link_id bigint(20) NOT NULL auto_increment,
    link_url varchar(255) default NULL,
    link_name varchar(255) default NULL,
    link_image varchar(255) default NULL,
    link_target varchar(25) default NULL,
    link_category int(11) NOT NULL default '0',
    link_description varchar(255) default NULL,
    link_visible enum('Y','N') NOT NULL default 'Y',
    link_owner int(11) NOT NULL default '1',
    link_rating int(11) NOT NULL default '0',
    link_updated datetime NOT NULL default '0000-00-00 00:00:00',
    link_rel varchar(255) default NULL,
    link_notes mediumtext,
    link_rss varchar(255) default NULL,
    PRIMARY KEY (link_id),
    KEY link_category (link_category),
    KEY link_visible (link_visible)

    CREATE TABLE $wpdb->options (
    option_id bigint(20) NOT NULL auto_increment,
    blog_id int(11) NOT NULL default '0',
    option_name varchar(64) default NULL,
    option_can_override enum('Y','N') NOT NULL default 'Y',
    option_type int(11) NOT NULL default '1',
    option_value longtext,
    option_width int(11) NOT NULL default '20',
    option_height int(11) NOT NULL default '8',
    option_description tinytext,
    option_admin_level int(11) NOT NULL default '1',
    autoload enum('yes','no') NOT NULL default 'yes',
    PRIMARY KEY (option_id,blog_id,option_name),
    KEY option_name (option_name)

    CREATE TABLE $wpdb->post2cat (
    rel_id bigint(20) NOT NULL auto_increment,
    post_id bigint(20) NOT NULL default '0',
    category_id bigint(20) NOT NULL default '0',
    PRIMARY KEY (rel_id),
    KEY post_id (post_id,category_id)

    CREATE TABLE $wpdb->postmeta (
    meta_id bigint(20) NOT NULL auto_increment,
    post_id bigint(20) NOT NULL default '0',
    meta_key varchar(255) default NULL,
    meta_value text,
    PRIMARY KEY (meta_id),
    KEY post_id (post_id),
    KEY meta_key (meta_key)

    CREATE TABLE $wpdb->posts (
    ID bigint(20) unsigned NOT NULL auto_increment,
    post_author int(4) NOT NULL default '0',
    post_date datetime NOT NULL default '0000-00-00 00:00:00',
    post_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',
    post_content longtext,
    post_title text,
    post_category int(4) NOT NULL default '0',
    post_excerpt text,
    post_status enum('publish','draft','private','static','object') NOT NULL default 'publish',
    comment_status enum('open','closed','registered_only') NOT NULL default 'open',
    ping_status enum('open','closed') NOT NULL default 'open',
    post_password varchar(20) default NULL,
    post_name varchar(200) default NULL,
    to_ping text,
    pinged text,
    post_modified datetime NOT NULL default '0000-00-00 00:00:00',
    post_modified_gmt datetime NOT NULL default '0000-00-00 00:00:00',
    post_content_filtered text,
    post_parent int(11) NOT NULL default '0',
    guid varchar(255) default NULL,
    menu_order int(11) NOT NULL default '0',
    KEY post_name (post_name)

    CREATE TABLE $wpdb->users (
    ID bigint(20) unsigned NOT NULL auto_increment,
    user_login varchar(60) default NULL,
    user_pass varchar(64) default NULL,
    user_firstname varchar(50) default NULL,
    user_lastname varchar(50) default NULL,
    user_nickname varchar(50) default NULL,
    user_nicename varchar(50) default NULL,
    user_icq int(10) unsigned NOT NULL default '0',
    user_email varchar(100) default NULL,
    user_url varchar(100) default NULL,
    user_ip varchar(15) default NULL,
    user_domain varchar(200) default NULL,
    user_browser varchar(200) default NULL,
    user_registered datetime NOT NULL default '0000-00-00 00:00:00',
    user_level int(2) unsigned NOT NULL default '0',
    user_aim varchar(50) default NULL,
    user_msn varchar(100) default NULL,
    user_yim varchar(50) default NULL,
    user_idmode varchar(20) default NULL,
    user_activation_key varchar(60) default NULL,
    user_status int(11) NOT NULL default '0',
    user_description longtext default NULL,
    UNIQUE KEY user_login (user_login)
    function populate_options() {
    global $wpdb;
    $guessurl = preg_replace('|/wp-admin/.*|i', '', 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
    add_option('siteurl', $guessurl, __('WordPress web address'));
    add_option('blogname', __('My Weblog'), __('Blog title'));
    add_option('blogdescription', __('Just another WordPress weblog'), __('Short tagline'));
    add_option('new_users_can_blog', 0);
    add_option('users_can_register', 0);
    add_option('admin_email', '');
    add_option('start_of_week', 1);
    add_option('use_balanceTags', 1);
    add_option('use_smilies', 1);
    add_option('require_name_email', 1);
    add_option('comments_notify', 1);
    add_option('posts_per_rss', 10);
    add_option('rss_excerpt_length', 50);
    add_option('rss_use_excerpt', 0);
    add_option('use_fileupload', 0);
    add_option('fileupload_realpath', ABSPATH . 'wp-content');
    add_option('fileupload_url', get_option('siteurl') . '/wp-content');
    add_option('fileupload_allowedtypes', 'jpg jpeg gif png');
    add_option('fileupload_maxk', 300);
    add_option('fileupload_minlevel', 6);
    add_option('mailserver_url', '');
    add_option('mailserver_login', '');
    add_option('mailserver_pass', 'password');
    add_option('mailserver_port', 110);
    add_option('default_category', 1);
    add_option('default_comment_status', 'open');
    add_option('default_ping_status', 'open');
    add_option('default_pingback_flag', 1);
    add_option('default_post_edit_rows', 9);
    add_option('posts_per_page', 10);
    add_option('what_to_show', 'posts');
    add_option('date_format', __('F j, Y'));
    add_option('time_format', __('g:i a'));
    add_option('links_updated_date_format', __('F j, Y g:i a'));
    add_option('links_recently_updated_prepend', '');
    add_option('links_recently_updated_append', '');
    add_option('links_recently_updated_time', 120);
    add_option('comment_moderation', 0);
    add_option('moderation_notify', 1);
    add_option('gzipcompression', 0);
    add_option('hack_file', 0);
    add_option('blog_charset', 'UTF-8');
    add_option('ping_sites', '');
    add_option('advanced_edit', 0);
    add_option('comment_max_links', 2);
    // 1.5
    add_option('default_email_category', 1, __('Posts by email go to this category'));
    add_option('use_linksupdate', 0);
    add_option('template', 'default');
    add_option('stylesheet', 'default');
    add_option('comment_whitelist', 1);
    add_option('comment_registration', 0);
    add_option('open_proxy_check', 1);
    add_option('rss_language', 'en');
    add_option('html_type', 'text/html');
    // 1.5.1
    add_option('use_trackback', 0);
    // Delete unused options
    $unusedoptions = array ('blodotgsping_url', 'bodyterminator', 'emailtestonly', 'phoneemail_separator', 'smilies_directory', 'subjectprefix', 'use_bbcode', 'use_blodotgsping', 'use_phoneemail', 'use_quicktags', 'use_weblogsping', 'weblogs_cache_file', 'use_preview', 'use_htmltrans', 'smilies_directory', 'fileupload_allowedusers', 'use_phoneemail', 'default_post_status', 'default_post_category', 'archive_mode', 'time_difference', 'links_minadminlevel', 'links_use_adminlevels', 'links_rating_type', 'links_rating_char', 'links_rating_ignore_zero', 'links_rating_single_image', 'links_rating_image0', 'links_rating_image1', 'links_rating_image2', 'links_rating_image3', 'links_rating_image4', 'links_rating_image5', 'links_rating_image6', 'links_rating_image7', 'links_rating_image8', 'links_rating_image9', 'weblogs_cacheminutes', 'comment_allowed_tags', 'search_engine_friendly_urls', 'default_geourl_lat', 'default_geourl_lon', 'use_default_geourl', 'weblogs_xml_url');
    foreach ($unusedoptions as $option) :
    // Set up a few options not to load by default
    $fatoptions = array( 'moderation_keys', 'recently_edited', 'blacklist_keys' );
    foreach ($fatoptions as $fatoption) :
    $wpdb->query("UPDATE $wpdb->options SET autoload = 'no' WHERE option_name = '$fatoption'");

  5. Open http://localhost/wordpress/wp-admin/install.php. Click First Step ».

    Click First Step >>

    Note: If you get an error "Your PHP installation appears to be missing the MySQL which is required for WordPress.", try the following:

    Open C:\php\php.ini and make the following changes:

    Line 648

    Line 744
    mysql.default_host = localhost

    Line 747
    mysql.default_user = root

  6. Enter your blog title and your e-mail address, and then Click Continue to Second Step ».
    Click Continue to Second Step >>
  7. The next screen will give you a default password for the admin account. Remember this password!


  1. Visit http://localhost/wordpress/wp-login.php. Login with "admin" and the password given above.
  2. You should see the Dashboard.

    Note: You can always return to the dashboard by visiting http://localhost/wordpress/wp-admin/.
    WordPress Dashboard


There are almost unlimited configuration options for WordPress. From the Dashboard, click on the Options page to see for yourself. Here's some things I recommend at a minimum.