Posts Tagged ‘Wordpress’

Writing a custom Wordpress multi-instance widget

Thursday, December 3rd, 2009

wplogoblue-hoz-rgb

While working on a soon-to-be finished Wordpress theme for a client, I ran into a situation where it would be useful to create a custom widget that they could use to organize content on their site. Basically, they wanted to be able to select a random post or page and display some associated meta data. Essentially a custom image and content teaser. They were going to be doing this several times throughout the site, but in slightly different configurations. A post here, a page there. It seemed silly to hard-code these features. Using a widget would allow them to swap them out for a Twitter stream, or an RSS news feed in the future.

Making multi-instance widgets in Wordpress 2.8+ couldn’t be easier. Here is a good example to start with from the Wordpress codex.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
class My_Widget extends WP_Widget {
	function My_Widget() {
		// widget actual processes
	}
 
	function widget($args, $instance) {
		// outputs the content of the widget
	}
 
	function update($new_instance, $old_instance) {
		// processes widget options to be saved
	}
 
	function form($instance) {
		// outputs the options form on admin
	}
}
register_widget('My_Widget');
?>

And here is my finished widget (evolved from the above example).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<?php
/*
 * Custom mini-post widget
 */
class FGX_MiniPost_Widget extends WP_Widget {
	function FGX_MiniPost_Widget() {
		// widget actual processes
		parent::WP_Widget(false, $name = 'Floragenex MiniPost', array(
			'description' => 'Display a teaser for a post or a page.'
		));
	}
 
	function widget($args, $instance) {
		// outputs the content of the widget
			global $post;
 
			extract( $args );			
			$type = $instance['type'];
			$include = (!empty($instance['include']) ? explode(',', $instance['include']) : '');
			$category = (is_numeric($instance['category']) ? (int)$instance['category'] : '');
 
                        // Set up query for posts with the provided filters
			query_posts(array(
				'post_type' => $type,
				'post__in' => $include,
				'post__not_in' => array($post->ID),
				'cat' => $category,
				'post_status' => 'publish',
				'meta_key' => 'teaser_value',
				'meta_value' => '',
				'meta_compare' => '!=',
				'orderby' => 'rand',
				'posts_per_page' => '1'
			));
 
			echo $before_widget;
 
                        // Output widget, if a post exists that matches our query
			if ( have_posts() ) :
				while ( have_posts() ) : the_post();
					$post_meta = get_post_custom($post->ID);
					echo (!empty($post_meta['image_value'][0]) ? '<a href="' . get_page_link() . '">' .
							 '<img alt="image" src="' . get_bloginfo('template_url') . '/scripts/timthumb.php?src=' . htmlentities($post_meta['image_value'][0]) . '&h=62&w=180&zc=1" />' .
							 '</a>' : '') .
							 '<h3><a href="' . get_page_link() . '">' . get_the_title() . '</a></h3>' .
							 '<p>' . htmlentities($post_meta['teaser_value'][0]) . '</p>' .
							 '<p><a class="learn-more" href="' . get_page_link() . '">learn more</a></p>';
				endwhile;
			else:
				echo '<p>No posts found.</p>';
			endif;
 
                        // Very important to reset the query here.
			wp_reset_query();
 
			echo $after_widget;
	}
 
	function update($new_instance, $old_instance) {
		// processes widget options to be saved
		return $new_instance;
	}
 
	function form($instance) {
		// outputs the options form on admin		
		$type = esc_attr($instance['type']);
		$include = esc_attr($instance['include']);
		$category = esc_attr($instance['category']);
 
                // Get the existing categories and build a simple select dropdown for the user.
		$categories = get_categories();
 
		$cat_options = array();
		$cat_options[] = '<option value="BLANK">Select one...</option>';
 
		foreach ($categories as $cat) {
			$selected = $category === $cat->cat_ID ? ' selected="selected"' : '';
			$cat_options[] = '<option value="' . $cat->cat_ID .'"' . $selected . '>' . $cat->name . '</option>';
		}
 
		?>
			<p>
				<label for="<?php echo $this->get_field_id('type'); ?>">
					<?php _e('Content type:'); ?>
				</label>
				<select id="<?php echo $this->get_field_id('type'); ?>" class="widefat" name="<?php echo $this->get_field_name('type'); ?>">
					<option value="post"<?php echo ($type === 'post' ? ' selected="selected"' : ''); ?>>Post</option>
					<option value="page"<?php echo ($type === 'page' ? ' selected="selected"' : ''); ?>>Page</option>
				</select>
			</p>
			<p>
				<label for="<?php echo $this->get_field_id('include'); ?>">
					<?php _e('Include post IDs (optional):'); ?>
				</label>
				<input id="<?php echo $this->get_field_id('include'); ?>" class="widefat" type="text" name="<?php echo $this->get_field_name('include'); ?>" value="<?php echo $include; ?>" />
			</p>
			<p>
				<label for="<?php echo $this->get_field_id('category'); ?>">
					<?php _e('Include category (optional):'); ?>
				</label>
				<select id="<?php echo $this->get_field_id('category'); ?>" class="widefat" name="<?php echo $this->get_field_name('category'); ?>">
					<?php echo implode('', $cat_options); ?>
				</select>
			</p>				
		<?php
	}
}
 
// register widget
register_widget('FGX_MiniPost_Widget');
?>

Just paste this code in your theme’s functions.php file and the widget should appear under your available widgets.

This was a quick braindump post, so please feel free to post with any specific questions.

Moving your blog off Blogger to a self-hosted Wordpress site

Monday, October 19th, 2009

wplogoblue-hoz-rgb

I have a client who absolutely loves Wordpress, but one of her long-time blogs has been hosted at Blogger since the dawn of time. Luckily, thanks to some persistence and a handy Wordpress plugin, she’s now happily blogging with Wordpress.

Step 1: Set up and configure Wordpress
First thing to do is get yourself a self-hosted Wordpress install. Many hosts these days even offer easy “one-click” installs of Wordpress through their control panels. Otherwise check out the Wordpress docs for help getting started.

If you need hosting recommendations shoot me an email or leave a comment. I’d be glad to recommend some of my favorites.

Step 2: Import your Blogger content
Once you’ve got Wordpress installed and hooked into your database, it’s time to import your old Blogger content. Log into the Wordpress admin panel and go to “Tools->Import->Blogger.” Follow the onscreen directions to complete this step.

Double check the imported posts and pages to make sure that all your content is there. Pay special attention to images in posts.

Step 3: Install plugins
Now, we all know you’ve developed a huge following on your blog, at least, that’s what you tell your friends. You don’t want all your incoming links to go dark once you move off Blogger, ideally you’d like them to point to the same posts on your new Wordpress site. The solution here is to use a nifty plugin called “wp-maintain-blogger-permalinks.” Following the directions at the link below will make this happen:

http://justinsomnia.org/2006/10/maintain-permalinks-moving-from-blogger-to-wordpress/

Now, if you don’t want to mess around with your .htaccess file to go “.html-less.” You can simply append “.html” to the end of your permalink structure. In Wordpress go to “Settings->Permalinks” and check the “Custom Structure” radio button. Modify this structure by removing the trailing “slash” and adding “.html” to the end. Don’t forget to save your changes!

Step 4: Update the DNS settings for your custom domain
It took me a while to find out how to update the DNS settings for a custom domain bought through the Blogger interface. It’s actually pretty easy. Just go to the following URL:

http://www.google.com/a/cpanel/yourdomainhere.com/

Log in to Google Apps using your Blogger ID and password. Then navigate to “Domain Settings ->Domain Names” and click on the “Advanced DNS settings” link.

google-blogger-custom-domain-dns-settings

Step 5: Get your custom domain transferred to a new registrar

You can certainly leave your domain hosted with Google’s affiliate registrar, but if you are hosting other domains elsewhere, it may make sense to consolidate your resources. To initiate the transfer process, you’ll need to obtain your domain’s authorization code from Google’s affiliate registrar.

If you’d like to transfer your domain to another domain registrar, you’ll need your domain’s authorization code. To obtain your authorization code, sign in to the DNS console of your domain host. Instructions vary by domain host.

https://www.google.com/support/a/bin/answer.py?hl=en&answer=112049

Your domain will either be registered at ENOM or GoDaddy through Google. The Google Apps. panel will tell you where your domain is registered. You’ll need to contact the registrar directly to obtain the transfer authorization code. ENOM can be contacted at GoogleClients@enom.com or by phone at 425-974-4623. Although you may need to pester them to get a response.

Good luck and let me know if you have any advice I may have overlooked!

New Skins – EMU Marketing

Sunday, July 26th, 2009

emu-marketing-destyle-theme

I decided it was time to freshen up the EMU Marketing blog a bit, so after a little hunting, I swapped out the old theme for the fantastic (and free) deStyle Wordpress theme – from ThemeShift.

I was pleasantly surprised by the quality of the deStyle theme. It features a custom theme options page; integrated Twitter and Flickr modules; ad-support; author bios; and really nice looking markup. The whole theme is just nicely polished.

ThemeShift has two other premium themes, deGusto and deCasa.

EMU Marketing is where I work. We do web development and and print design for student groups and University services housed within the Erb Memorial Union. Keep an eye out for some exciting news in the next few days. Hopefully we’ll have something fun to show you.

Woo! Wordpress 2.8.

Wednesday, July 8th, 2009

wordpress-logo-hoz-rgb

Wordpress 2.8 is out! If you haven’t already you should go download it now.

As of this post Wordpress 2.8 has been downloaded 1,522,482 times, that’s pretty amazing.

I’m actually blown away every time I install a new version of Wordpress. It seems like they iron out a few more rough spots each release and the whole experience just gets that much better. As far as open source projects go, the Wordpress team definitely has their shit together.

In other news. I’ve been doing some contract work for a client, part of which includes getting them moved from Wordpress.com to a self-hosted Wordpress blog.

After getting Wordpress 2.8 up and running it was time to do some skinning. We decided that the Puretype Theme from Elegant Themes would be a good place to get started. After that, it only took a few hours to modify Puretype a bit to match the client’s website. It helps speed things up immensely when you have some pre-existing graphics to work with.

You can see the final result at blog.goodtugo.com.