Archive

Posts Tagged ‘Wordpress’

Creat an “Archives” Page in Your WordPress Blog

July 18th, 2009 No comments

[ Note: You need to have “Exec-PHP” plugin activated in order for the code in this post to work. ]

I planned to create an “Archives” page in my blog. On this “Archives” page, I wanted to list all my posts and organize them in categories. In each category, posts would be sorted by date.

Obviously I needed to write some PHP code and use a few WordPress functions to achieve this goal. The first step was to retrieve all the categories from my blog. This was done using get_categories() function:

$categories = get_categories('orderby=name');
foreach ($categories as $cat)
{
    echo $cat->cat_name;
    echo ' (';
    echo $cat->category_count;
    echo ')';
    echo '<br />';
}

For every category retrieved from my blog, I needed to get all the posts in that category and list them in a table. To do this, I needed to create my own “Loop” in my code. There is a post on BlogChemistry.com talking about creating customized “Loop” in three ways. The first two methods, which involve using query_posts() and get_posts(), did not work for me. When I tried them, for some reason, the_permalink() and the_title() functions did not return the permalinks and the titles of the posts. Instead, they only returned the permalink and the title of the page -:( The third method involves using WP_Query class, which worked nicely for me. There is another good article on WP_Query.

To create a customized “Loop”, I made an instance of the WP_Query class and did it from scratch:

$my_query = new WP_Query($query_string);
if ($my_query->have_posts())
{
    while ($my_query->have_posts())
    {
        $my_query->the_post();
        echo the_permalink();
        echo the_title();
    }
}

After adding some HTML formatting tags and putting all together, I got the complete source code for my “Archives” page:

WordpressArchivesPageCode

Daylight Saving Time in WordPress 2.8

July 17th, 2009 No comments

Starting from version 2.8, WordPress is capable of adjusting for daylight saving time automatically. In order for WordPress to do this, you have to choose a nearest city in the WordPress timezone setting. Go to “Dashboard -> Settings -> General”. Choose the city that is closest to you in the “Timezone” drop-down menu. In my case, I chose “Los Angeles” since I’m located in California.

WordpressTimeZone02
Figure 1. If you choose a city from Timezone drop-down menu, WordPress will automatically adjust for daylight saving time.

One thing to note is that you have to choose a city from the drop-down menu. If you choose a “Manual Offset” timezone, say, “UTC -8:00”, WordPress would not be able to adjust for daylight saving time automatically, as shown in the following figure:

WordpressTimeZone01
Figure 2. If you choose a “Manual Offset” timezone, WordPress will NOT automatically adjust for daylight saving time.

升级WordPress遇到的问题

July 11th, 2009 No comments

前两天我在博客里提到我把自己的 Blog 搬家,顺便把wordpress从1.5版本升级到了2.8.1版本。升级的过程并不是一帆风顺,其间遇到了一些数据库方面的问题。

我最初的计划是按照 Yan’s Five Easy Steps 将Blog移植到新主机上。本来Yan的方法简单易懂,按照他的步骤应该很快就能搞定。可是偏偏在第五步,也就是在 phpMyAdmin 中将旧数据库的数据导入到新数据库的时候出问题了。phpMyAdmin 报错,然后提示导入失败。我试了好几次都是同样的结果(后来我想了一下,很有可能 wordpress 在1.5版本之后修改了数据库结构,使得旧数据库的数据无法导入到新数据库)。万般无奈之下,我只好求其次,使用 wordpress 自带的导入/导出功能把旧帖子搬了过来。这个方法似乎解决了问题,因为在我粗略浏览了一下 Blog 后并没有发现什么问题。

但是第二天当我在 wordpress 的 Dashboard 里面进行一些维护工作时发现了一些问题。

  1. 首先是 Dashboard 显示的帖子总数不对,如图一所示。
  2. 从图中可以看到,在 Dashboard 中显示的我的 Blog 帖子总数为105,发表了的帖子数为35。事实上我的 Blog 一共只有35个帖子,一个不多一个不少。那么这凭空多出来的70个帖子是从哪里来的呢?

    WPDashiboard-Posts
    图一、Wordpress的Dashboard里面显示的帖子总数不正确。

    经过仔细检查,我用 phpMyAdmin 发现了 wordpress 数据库的问题。图二显示的是 wordpress 的 wp_posts 表的一个截图。从图中可以看到 wp_posts 中包含有两个 fields:post_statuspost_type。而从表一中可以看到 wordpress 的1.5版本和2.8.1版本对post、page、和 attachment 的处理是不一样的。

    WPDatabaseMess
    图二、Wordpress的wp_posts数据库里的数据有错误。

    表一、Wordpress的1.5版本和2.8.1版本对post、page、attachment的不同处理。

      WordPress 1.5版本 WordPress 2.8.1版本
    post_status post_type post_status post_type
    post (published) publish post publish post
    page static post publish page
    attachment attachment post inherit attachment

    在1.5版本中,post、page 和 attachment 对应的 post_type 都是 post,区分它们的是 post_status。而在2.8.1版本中,post、page 和 attachment 对应的 post_type 各不相同,相应的 post_status 也有少许区别。明白了这点,再回头来看上面的帖子总数问题就容易理解了。原来当 wordpress 导入旧 Blog 的时候沿用了1.5版本的数据,导致所有的post、page 和 attachment 都被 wordpress 认为是 post。因此在 Dashboard 里面显示的帖子总数比实际帖子数多。

    为了改正这个错误,需要在 phpMyAdmin 输入 SQL 命令对 wordpress 数据库进行修改。首先我们要把 attachment 的 post_typepost 改成 attachment,把 post_statusattachment 改成 inherit。相应的 SQL 命令是:

    UPDATE wp_posts SET post_type="attachment" WHERE post_status="attachment";
    UPDATE wp_posts SET post_status="inherit" WHERE post_type="attachment";

    接着我们要把 page 的 post_typepost 改成 page,把 post_statusstatic 改成 publish。相应的 SQL 命令是:

    UPDATE wp_posts SET post_type="page" WHERE post_status="static";
    UPDATE wp_posts SET post_status="publish" WHERE post_type="page";

  3. wp_posts 表中 guid 一栏的网址都是 Blog 移植前的网址,如图二所示。
  4. 我的新 Blog 的地址是 “http://tech.eternj.net”,而 guid 栏里显示的是我的旧 Blog 的网址:”http://highdrawer.strangled.net/blog”,因此需要把 guid 里的地址改正过来。相应的 SQL 命令是:

    UPDATE wp_posts SET guid=REPLACE(guid, 'http://highdrawer.strangled.net/blog', 'http://highdrawer.eternj.net');

    WPDatabaseGuid
    图三、wp_posts 表里的 guid 显示的是旧 Blog 的地址。

  5. wp_posts 表里的 post_parent 栏里的很多数值都是错误的。
  6. 这个问题直接导致在 Dashboard 里面显示 Media 的时候,每个附件和其对应的帖子完全弄混。解决这个问题没有好办法,只有手工修改每一个错误的数值。

Blog搬家

July 9th, 2009 No comments

今天把自己的博客移植到了一个新主机上。搬家的原因主要出于以下考虑:以前的博客是建立在自己的个人电脑上的,虽然管理和维护起来非常方便,但是在线时间不能保证,而且上传速度很慢,一旦图片多了就会严重影响浏览速度。现在这个博客的新主机是由 www.bluehost.com 提供的,希望更换主机后博客的在线时间和浏览速度会有显著改善(从这几天的测试来看我还是比较满意的)。

另外,趁着换主机,我顺便把 wordpress 从1.5版本升级到了2.8.1版本。原来的 wordpress 版本太低了,很多新 theme 和 plugin 都不能用。升级之后能够尝试更多的模板和插件了。

Categories: Uncategorized Tags: ,

Change Page Orders in WordPress

July 8th, 2009 No comments

Directly copied from WordPress support page:

Pages are usually ordered alphabetically, but you can change the order pages are displayed in by using the order field.

Let’s say you have three pages: Animals, Machines, WordPress.

That is the order they will normally appear in. If you wanted WordPress to appear first, you need to do the following:

1. Click Pages –> Edit on the menu.
2. Find the page WordPress and click the title.
3. Find the Attributes module.
4. Put the number 1 in the text field for Order. This tells WordPress to make this the first page in the list.
5. Click the Update Page button.

Repeat the process for your other pages, but use higher numbers for the Order field: 2, 3, etc. This tells WordPress to make these the second and third items in the list.

If you are using the Pages Widget, you will want to edit the widget, click on the Sort By dropdown, and change it to Page Order. Then click the Done button on the widget options box and finally, click the Save Changes button.

Exec-PHP Plugin for WordPress

July 8th, 2009 No comments

In order to execute PHP code in your wordpress post, you will need a plugin that does that for you. I am using Sören Weber’s Exec-PHP plugin.

Install

To install the Exec-PHP plugin:

  1. Download the Exec-PHP plugin archive and extract the files.
  2. Copy the resulting exec-php directory into /wp-content/plugins/ directory.
  3. Activate the plugin through the “Plugins” menu of WordPress (after a fresh installation only the Administrator is allowed to execute PHP code).
  4. Configure blog and user settings if needed.

Usage

With Exec-PHP you can execute PHP code in the excerpt and the content portion of your posts and pages (in the following called articles) as also as in text widgets. To execute code, just type in the PHP code as you usually would, encapsulated in <?php ?> tags.

What if I just want to print out PHP code and don’t execute it?

If you just want to print out code and don’t want to execute it, you have to make sure to convert your code to the correct XHTML representation. To do so you have to escape the following characters: < to &lt;, > to &gt;, and & to &amp;.

Categories: Wordpress Tags: , ,

Image Path Broken after Changing Permalinks in WordPress

July 8th, 2009 No comments

The Problem

It is common to use relative image paths in your wordpress post. If you put the image files in the images folder of the root directory. Then the path to, say, logo.jpg is coded as

<img src="/images/logo.jpg" />

This works until you change your permalinks. Permalinks change the url to reflect a directory stucture in place of the ugly '?page_id=127', thus breaking the path to images folder.

The Hack

Where you have used relative image paths, replace it with

<img src="<?php echo get_option('siteurl'); ?>/images/logo.jpg" />

This uses your specific siteurl as a prefix to the path of the image.

Hope this helps, it is a great hack.