<li><strong>PHP4</strong> (version 4.0.6 or higher)</li>
<li><strong>MySQL</strong> (version 3.23.23 or higher)</li>
<li>... and a link to <ahref="http://wordpress.org">http://wordpress.org</a> on your site.</li>
</ul>
<p>The link will help promote <ahref="http://wordpress.org">WordPress</a> and is its only mean of promotion. </p>
<p>WordPress is built from b2, which comes from Michel V. We wouldn't be here without him, so why don't you grab him something from his <ahref="http://www.amazon.com/exec/obidos/registry-address-select-done/1XKLC38KDUPXR/103-8901342-4908609">wishlist</a>? You can also support the <ahref="http://wordpress.org/about/">WordPress developers</a>. </p>
<p>This document is currently <em>beta</em> stage, we'll be updating it extensively as WordPress matures. There is also <ahref="http://wordpress.org/docs/">online documentation</a> under development, as well as a <ahref="http://wiki.wordpress.org">wiki</a>.</p>
<li>Open <spanclass="file">wp-config-sample.php</span> in a text editor and insert your database name, username, password, and host name as indicated in the comments. (Comments are lines that start with <code>/*</code> or <code>//</code>.) Save this file as <spanclass="file">wp-config.php</span>.</li>
<li>Upload everything. This release is designed to sit in your root folder; i.e, the folder where your WordPress-powered page will reside.</li>
<li>The weblogs.com cache file needs to be writable by the web server. <ahref="http://www.evolt.org/article/A_quick_and_dirty_chmod_Tutorial/18/541/">CHMOD 666</a> the <spanclass="file"><code>weblogs.com.changes.cache</code></span> file. </li>
<li> Launch <spanclass="file">/wpfolder/wp-admin/install.php</a></span> in your browser. This should setup the MySQL database for your blog. <strong>Note the password given to you.</strong> If there is an error, double check your wp-config.php file, and try again. If it fails again, please go to the <ahref="http://wordpress.org/support/">support forums</a> and make a post with all the information about the failure (error messages, etc), and your setup (the PHP and MySQL versions on your server, and the browser you were using). </li>
<li> During step 2 of the installation, make sure you enter a fully-qualified domain name for your blog url. For example: <spanclass="file">http://www.yoursite.com/wordpress</span> . Make sure there is no trailing slash at the end of the url.</li>
<li> The install script should then send you to the login page. Sign in with the username "admin" and the password generated during the installation. Then click on the item 'My Profile', and change the password. The login page may also be accessed by going to <spanclass="file">/wpfolder/wp-login.php</span>. Note: you need javascript enabled to launch the profile popup window.</li>
<li> By default, your site's blog is located at <spanclass="file">index.php</span>, which is an elaborate .CSS-based template. There is a non-.CSS template you can also use, called <spanclass="file">wp.php</span>. You can rename either of these files as any other name you fancy (provided it bears the php extension or is interpreted as a php file by your server).</li>
<ul><li><strong>Back up</strong> your database before you do anything. </li>
<li>If you haven't already, we strongly suggest that you <strong>BACK UP</strong> your database.</li>
<li>Have you <strong>BACKED UP</strong> your database? Yeah? GREAT!</li>
<li>If you don't know how to do this, <ahref="http://wordpress.org/support/10/1384">this script</a> can help.</li>
</ul>
<h2>Upgrading from WordPress v0.7x to v1.0:</h2>
<ul>
<li><strong>Backup your database.</strong> Yes, you. Right now.</li>
<li>Point your browser to <spanclass="file">/wp-admin/upgrade.php.</span></li>
<li>You wanted more, perhaps? That's it!</li>
</ul>
<h2>Note on upgrading to v1.0:</h2>
<ul>
<li>It is <strong>strongly</strong> recommended that you use the new <spanclass="file"> index.php</span> for your templates, rather than simply upgrading your old one. Sure, it'll take a little time, but you'll be much happier with the results when you do!</li>
<h2>Upgrading from b2 v0.6.1/v0.6.2.2 to WordPress v1.0:</h2>
<li><strong>Back up</strong> your database before you do anything. Yes, you. Right now.</li>
<li>You <em>must</em> configure <spanclass="file"><code>wp-config.php</code></span> as indicated in the "5-minute install" section.</li>
<li>All you <em>really</em> have to do is replace all the files with newer versions and run <spanclass="file">wp-admin/upgrade.php</span> and you should be ready to go.</li>
<li>There is also an import script at <spanclass="file">wp-admin/import-b2.php</span>.</li>
<h2>Upgrading to WordPress v1.0 from Textpattern, GreyMatter, & Blogger</h2>
<ul>
<li>Did we mention <strong>BACKING UP</strong> your database first?</li>
<li>Each of these tools has an import script available. They are all located in the wp-admin directory, and must first be configured with your database information before they are executed.
<li>Detailed importing instructions are given during the execution of the import script.
<li>Textpattern: run <spanclass="file">wp-admin/import-textpattern.php</span>.</li>
<li>GreyMatter: run <spanclass="file">wp-admin/import-greymatter.php</span>.</li>
<li>Blogger: run <spanclass="file">wp-admin/import-blogger.php</span>.</li>
<li>Enclosed is an example of a template, in the file <spanclass="file">wp.php</span>. You can rename this file to "index.php"or something else (WordPress 1.0 has a default index.php, which is an elaborate CSS-based template).</li>
<li>The only thing to remember is that it's not actually a template, but a PHP file that you're manipulating. So when you see "don't delete this line", you know you mustn't, unless you want to have a broken page.</li>
<li>Required lines are: the first lines that call wp-blog-header.php, the lines with the "while" statement, and the ones with just "}" (it ends the while loop).</li>
<li>The order of parameters is important. If a function accepts 2 parameters and you only want to set the second one, you still have to provide the first one, and so on for any number of parameters.<br/>
<li>Some template tags, like the_date(), display something only in certain conditions. They generally accept parameters to display something before and after them only when they display something.<br/>
Example: <code><?php the_title("<h1>", "</h1>"); ?></code> would display <h1>title of the post</h1> only if the post has a title </li>
<li>string: can be 'name' to display the name of your weblog (you set it in the options page), 'url', 'description', 'admin_email', 'rss_url' to display the URL of your wp-rss2.php file, 'pingback_url' to display the URL of your xmlrpc.php file<br/>
<strong>Note about the_date():</strong> If you want all your posts to bear the date, you'll have to use the_time() instead, with a date format string. For example, to have all your posts show as "25.12.2001 @ 8:04:50 AM" you'll have the_time("d.m.Y @ g:i:s A"). You can also repeat this template tag 2 times with 2 different formats: the_time("d.m.Y") for the date, and then later the_time("g:i:s A") for the time of the day.<br/>
<strong>Note:</strong> You can change the way the date & time are displayed in the Options page.<br/>
Once you understand the format strings for the date & time (explained in the Options page), you can change the display right on the template: for example, you can change <strong>the_date(</strong><em>"d.m.Y"</em><strong>)</strong> to have dates like 25.12.2001, or <strong>the_time(</strong><em>"B"</em><strong>)</strong> to have Swatch Internet Time.<br/>
If you change the display of the date on the template, changing it from the options page won't have any effect. <br/>
This displays the day of the week when the post was made. It works like the_time(), in that it would appear at every post. Weekdays can be obtained with a custom date format string in the_time() or the_date(), but for non-english weekdays you have to edit day-month-trans.php<br/>
<li>text to display for the link to the complete entry (default is <em>'(more...)'.</em>)</li>
<li>0 or 1, indicating whether you want to show the teaser message when showing the complete text (default is 1).</li>
<li>a filename of another template, if you want the 'more' link to link to a different template for the complete text of the extended entry (default is the current template).</li>
For example <em><?php the_content("read more","0","blah.php") ?></em> would display a link to <em>blah.php</em>, with the link text <em>read more</em>, and won't display the teaser message.<br/>
To enter an extended entry, just type <em><!--more--></em> in your entry. The part before that comment is the teaser, the part after it is the extended entry. To force the extended entry to not to show the teaser message, type <em><!--noteaser--></em> somewhere in your entry.<br/>
It outputs the title of the post when you load the page with ?p= (see 'Usage' section for explanation). When the weblog page is loaded without ?p=, this tag doesn't display anything. Generally, you could use it like this:<br/>
<li>number: which next post ? If you make it '2', the 2nd next post is linked instead of the 1st next one (default is "1", which means first next post)</li>
It outputs the name of the month when you load the page with ?m= (see 'Usage' section for explanation). When the weblog page is loaded without ?m=, this tag doesn't display anything. Generally, you could use it like this:<br/>
<li>number: which previous post ? If you make it '2', the 2nd previous post is linked instead of the 1st previous post (default is "1", which means first previous post)</li>
Display the URL portion of a link to the next set of posts. <br/>
Generally you would use this in a template to navigate to the next "set" of posts when the "Show Options" settings for the site is set to "posts paged". The displayed string can be used to construct a link. When the site options are not set to 'posts paged", the next_posts() and previous_posts() functions will display nothing.<br/>
Displays a full link to the next "set" of posts only if show options set to "posts paged" and only if there is another page or partial page of data.<br/>
Displays the URL portion of a link to the previous posts.<br/>
Generally you would use this in a template to navigate to the previous "set" of posts when the "Show Options" settings for the site is set to "posts paged". The displayed string can then be used to construct a link. When the site options are not set to 'posts paged", the next_posts() and previous_posts() functions will display nothing.<br/>
Displays a full link to the previous "set" of posts only if show options set to "posts paged" and if there is a previous set, otherwise nothing is displayed.<br/>
The function displays a complete navigation set of links including a user definable "separator" with the ability to supply the text string to be used for the "previous" and "next" links.<br/>
<li>string to display before the tag (default is "<br />", a newline)</li>
<li>string to display after the tag (default is "<br />", a newline)</li>
<li>"next" or "number": display links like "next/previous page" or links to each page with the number of the page "1 2 3 4 etc" (default is "number")</li>
<li>string to display the "next page" link (default is "next page")</li>
<li>string to display the "previous page" link (default is "previous page")</li>
<li>format string for the "number of page" link (default is "%", where % is replaced by the number of the page)</li>
<li>file name, in case you want to load the posts with multiple pages in a different template (default is the current template)</li>
Depending on the user's profile settings, it can display whether their nickname, login name, first name, last name, both first& last name, or last & first name. See below for more author-related template tags. <br/>
<br/>
<strong>Want more</strong> about the author of the post? Here goes:<br/>
<br/>
<strong><spanclass="tag"><?php the_author_email() ?></span>- </strong> the author's email.<br/>
<strong><spanclass="tag"><?php the_author_url() ?></span></strong> - the author's url.<br/>
<strong<spanclass="tag">><?php the_author_icq() ?></span></strong> - the author's ICQ number.<br/>
<strong><spanclass="tag"><?php the_author_aim() ?></span></strong> - the author's AIM handle.<br/>
<strong><spanclass="tag"><?php the_author_yim() ?></span></strong> - the author's Yahoo Messenger handle.<br/>
<strong><spanclass="tag"><?php the_author_msn() ?></span></strong> - the author's MSN Messenger handle.<br/>
<strong><spanclass="tag"><?php the_author_posts() ?></span></strong> - the author's post count.<br/>
<strong><spanclass="tag"><?php the_author_login() ?></span></strong> - the author's login name in WordPress. If you want some static data about the author, this is what you're searching for. You can, for example, associate a picture with an author, like this: <em><img src="pictures/<?php the_author_login() ?>.jpg" border="0"></em><br/>
<strong><spanclass="tag"><?php the_author_ID() ?></span></strong> - the author's ID number in WordPress. This number is automatically set when the user registers: to see the ID of an user, go to the Team page. This is static data too, so you can use it like the_author_login() in associating stuff with authors.<br/>
The name of the category the post belongs to. You can add categories, and rename them if needed. The default category is 'General'; you can rename it too.<br/>
The ID (number) of the category the post belongs to. This is static data that you can use; for example, to associate a category to an image, or a css style.<br/>
It will output a list of all links defined in the Links Manager, listed by category, with category headings, using the settings in the Links Manager to control the display and sorting of links within the categories. It outputs this data as a nested HTML unordered list. That sounds more complicated that it really is.
It will display a list of <option name="<em>x</em>"><em>category-name</em></option>, where <em>x</em> is the number of the category and <em>category-name</em> is the name of it.<br/>
<divclass="params">Parameters:
<ul>
<li>0 or 1, depending if you want to have an option to display all categories (default is 1)</li>
<li>text to display for the option to show all categories (default is "All")</li>
<li>0 or 1. 1 means generate the items inside <li> tags, to build an HTML list. 0 means to just follow each link with a <br /> tag. (default is 1)</li>
<li>0 or 1. 1 means display the date of the last post in each category (default is 0)</li>
<li>0 or 1. 1 means display a count of posts in each category (default is 0)</li>
<li>0 or 1. 1 means hide empty categories (default is 1)</li>
It outputs the title of the category when you load the page with ?cat= (see 'Usage' section for explanation). When the weblog page is loaded without ?cat=, this tag doesn't display anything. Generally, you could use it like this:<br/>
This will display the name of the file followed by #ID to link to the post, in the month archive if archive-mode is "monthly".<br/>
Note: This tag does not display the link. For that, you've got to type <a href="<?php permalink_link() ?>">text of the link</a>.<br/>
This will display the name of the file followed by #ID to link to the entire post (the linked page will also show the extended text on that post if it is an extended entry, and the comments).<br/>
Note: This tag does not display the link. For this you've got to type <a href="<?php permalink_single() ?>">text of the link</a>.<br/>
The same tags exist for TrackBack and Pingback, respectively named '<spanclass="tag">trackback_link()</span>' and '<spanclass="tag">pingback_link()</span>'. They take the same parameters.<br/>
This tag differs from v0.5's tag because in v0.5 and prior, it would only display a number, not a text with it, so you could have terrible things like "1 comments" (doh !)<br/>
<p>WordPress relies a lot on the query string. These variables passed with the URL (note: to pass variables in the querystring, preceed the first variable name with a '?' question mark and every other variables with a '&' sign.)</p>
<p>Most of the time you won't have to do anything about it, but if you want to know how it works, it's here:</p>
<p>How to use the query string:</p>
<p>index.php<strong>?m=200107</strong> will display the month of July 2001.</p>
<p>index.php<strong>?m=20010701</strong> will display all posts from July 1st, 2001.</p>
<p>index.php<strong>?w=20</strong> will display the posts from the 20th week of the year, where January 1st is in the first week (according to PHP).</p>
<p>index.php<strong>?p=50</strong> will display the post labeled #50 in the database.</p>
<p>index.php<strong>?s=blue+house</strong> will display the posts that match the search request "blue house".<br/>
<p>index.php<strong>?cat=1</strong> will display all posts that belong to category #1 (1 is the default). you can add/rename/delete categories from WordPress's interface.</p>
<p>index.php<strong>?author=1</strong> will display all posts from the author #1</p>
<p>index.php<strong>?p=50&c=1</strong> will display the comments and a form to add a comment below the post.<br/>
you should use this variable only with <strong>p=</strong>, example: index.php<strong>?p=50&c=1</strong>.</p>
<p>index.php<strong>?p=50&page=1</strong> will display the first page of post #50. this, again, should be used only with <strong>p=</strong>, for individual entries.</p>
<p>You can also mix these variables, example: index.php<strong>?m=200107&s=hotdog</strong> will display the posts that match the search request "hotdog", but only in July 2001.</p>
<h1id="xmlrpc">XML-RPC Interface:</h1>
<p>WordPress has an XMLRPC interface. Currently supported APIs are the <ahref="http://www.blogger.com/developers/api/1_docs/">Blogger API</a>, <ahref="http://www.xmlrpc.com/metaWeblogApi">metaWeblog API</a>, and the <ahref="http://www.movabletype.org/docs/mtmanual_programmatic.html">MovableType API</a>. There are talks about a new API that would cover a lot of weblog/CMS systems in the future: when it's ready, WordPress will support it.</p>
<p> The <ahref="http://www.blogger.com/developers/api/1_docs/">Blogger API</a> has been completely emulated on WordPress, with some little differences:</p>
<ul>
<li>using <em>blogger.getRecentPosts</em> with the number 'zero' returns all posts in the blog</li>
<li><em>blogger.getTemplate</em> fetches your file $blogfilename (as specified in the config), while <em>blogger.setTemplate</em> overwrites it with the edited data</li>
<p>If you use blogger.newPost, your post is submitted without title and in category #1.</p>
<p> However, you can type <title>my title</title> and/or <category>2<category> in the body of your post to make its title be 'my title' and its category be #2 (refer to your categories section to find out the ID numbers of the categories). b2 would then delete that extra info from the body of your post once it is posted.</p>
<p>The <ahref="http://www.xmlrpc.com/metaWeblogApi">metaWeblog</a> and <ahref="http://www.movabletype.org/docs/mtmanual_programmatic.html">MovableType</a> APIs are currently supported with the following exceptions:</p>
<ul>
<li>metaWeblog.newMediaObject, mt.getRecentPostTitles, and mt.getTrackbackPings are not yet implemented</li>
<li>mt.supportedTextFilters is a dummy stub function that returns an empty string</li>
<li>keywords are not supported in the MovableType API</li>
</ul>
<br/>
Extended entries in the <ahref="http://www.movabletype.org/docs/mtmanual_programmatic.html">MovableType API</a> are automatically converted to/from the WordPress <!--more--> tag.<br/>
<p>You can now post to your WordPress blog with tools like <ahref="http://blogbuddy.sourceforge.net">BlogBuddy</a>, <ahref="http://bloggar.com/">Bloggar</a>, <ahref="http://www.ubique.ch/wapblogger/">WapBlogger</a> (post from your Wap cellphone!), <ahref="http://radio.userland.com">Radio Userland</a> (which means you can use Radio's email-to-blog feature), <ahref="http://www.zempt.com/">Zempt</a>, <ahref="http://www.newzcrawler.com/">NewzCrawler</a>, and other tools that support the Blogging APIs! :)</p>
<p>Your XMLRPC server/path are as described here: if you login to WordPress on http://example.com/me/wp-login.php, then you have:</p>
<li>server: http://example.com/ (some tools will just want the 'example.com' hostname part)</li>
<li>path: /me/xmlrpc.php</li>
<li>complete URL (just in case): http://example.com/me/xmlrpc.php</li>
</ul>
<p>There's also a b2-specific method: b2.getCategories. Request it with 3 strings: blog_ID (use '1'), username, password. The response is an array of structs with strings categoryID and categoryName.</p>
<h1id="postviaemail">Post via Email:</h1>
<p>You can post news from an email client!<br/>
But first you'll have to edit the options on the options screen, filling the appropriate values for your POP3 email account (this interface doesn't support IMAP yet, only POP3, sorry).</p>
<p> Once you have edited the options, you can make your webserver execute wp-mail.php every set amount of time (depending on your host's performance, this script can be resource intensive, so don't make it run every minute or you'll be kicked).</p>
<p>You can do it with Cron-jobs, or if your host doesn't support it you can look into the various website-monitoring services, and make them check your wp-mail.php URL.</p>
<p> It is strongly advised to send your email as text-only (Outlook and Outlook Express default to 'html', which may cause problems), but HTML email could work (the script would strip all your html tags though...).</p>
<p>It is also advised not to use your public email address, but create a new one especially for this script. If you use your public email address and the script goes crazy posting every email on your blog and deleting all your emails, I can't take responsibility for this.</p>
<p>Make sure you delete any email sent to your blog in your 'Sent' folder too, just in case (you don't want someone to find your login and password in the 'Sent' folder).</p>
<p> The script will <i>delete</i> the emails that were used to post stuff on your weblog if it successfully posted your stuff. If it didn't manage to post, the email is not deleted.</p>
<h2>How to post:</h2>
<p>Now to post something, here's how your email should look like:</p>
<p> Subject must start with 'blog:', or any string you set in the config file (so that the script doesn't check EVERY email in your mailbox).</p>
<p>Body's first line must always be login:password, else the script will just skip the email.</p>
<p> If you don't use '___' (or any body terminator that you set in the config file), the script will post the whole body, which is not what you want if you send email with Yahoo or Hotmail (you don't want their ads on your blog, do you ?).</p>
<h2>Special cases for mobile phone email:</h2>
<p> Some mobile phone service providers may allow you to send email with your mobile phone or PDA, but on such devices you can't always include line breaks. In such case, you have to set <i>use_phoneemail = true</i> in the options, and then here's how you write the email:</p>
<b>Subject:</b> blog:the post's title <b>:::</b><br/>
<b>Body:</b><br/>
login:password <b>:::</b> The content of the post, blah blah blah.___ </div>
<p>You will have to append ':::' (or whatever string you set in the config file) after the subject, and after the login:password.</p>
<p>Some mobile phone service providers may not allow you to set a subject, and they'll make the subject be the first characters of the body, in which case you would send an email like this:</p>
<p>New users can register with <spanclass="file">wp-register.php</span>. Then you (as an admin) click the "+" next to their name on the Team page in admin to upgrade their level to 1 or more, so they can post. If you don't want an user to post anymore, just click "-" until their level is 0.</p>
<li>1 - user: can post & edit/delete their own posts.</li>
<li>3 & higher - admin: can post, edit/delete other people's posts, and change the options.</li>
<li>Any user whose level is higher than 1, can edit/delete the posts and change the level of users whose level is inferior. Example: a level 2 user is not an admin, but can edit the posts of level 1 users, and up the level of a new user from 0 to 1.</li>
</ul>
<p>Usually, you'll want to have a team of only level 1 users except you. ;)</p>
<p><strong>Note:</strong> you can modify an option on the option screens, to enable new users to post once they've registered.</p>
<li>WordPress is functional, but a lot of coding and code clean-up remain to be done.</li>
<li>If you've got suggestions, ideas, or comments, or if you found a bug, why not joining us in the <ahref="http://wordpress.org/support/">Support Forums</a>?</li>
<li>If you can code in PHP, you'll see the structure of WordPress is flexible enough to allow for more functions and sections to be added.</li>
</ul>
<h1>Copyright notes:</h1>
<ul>
<li>Wherever third party code has been used, credit has been given in the code’s comments.</li>
<li>WordPress is released under the <acronymtitle="GNU Public License">GPL</acronym> (see license.txt).</li>