Avoiding Timeout When Exporting Large WordPress Sites

When exporting large WordPress sites with thousands of posts and comments, I occasionally run into an issue where the WordPress export tool times out before it’s finished building the XML export file. This can usually be remedied by updating the config files for Apache and PHP. Temporarily increasing the amount of time allowed for a single request should solve the problem. Note that you’ll need access to your server’s config files to make these changes. If you don’t have access, explain to your web host what you’re trying to do and they should be able to help you out.

Assuming you have access, here are some values that you can try:

In the Apache config file, try setting Timeout 300, which means that a single request is allowed to take up to 300 seconds to process before it’s shut down.

You’ll have to make a similar change in the PHP config file. That line will look like max_execution_time = 300. While you’re in there, you may also want to increase the maximum amount of memory available to PHP for a single request. memory_limit = 256M should do the trick.

After you’ve made your config updates, restart Apache so that they take effect. Now you should be able to export your site without any problems. Be patient, as it can take several minutes to export a large site. The values above will give you up to 5 minutes. If it takes longer than that, the process will continue to timeout and you’ll have to make the values even larger.

It’s important to note that after you’re done with the export you should change the settings back to their initial values. No ordinary request should take 300 seconds. Leaving the timeout values that high will allow poorly written scripts to tie up Apache processes for a long time, which will seriously impact your server’s performance.

Batch Convert Domain Names to IP Addresses

Last week I needed to check a large number of sites to see how many of them were still hosted by my employer’s legacy system. After clicking through about 80 of them I realized it would have been much smarter to just ping them and see what IP address they were living at. I looked for a tool that would do that for me, but didn’t find one that would accept a list of domains and look them all up at once. So I made one.

DomainToIPConverter.com may be a new favorite among my tiny web apps. It accepts a list of host names and looks up the IP address of the server each is pointing to. That’s it. Please enjoy this potentially useful app that does exactly one thing.

Super Easy WordPress Breadcrumbs

Here’s a simple script to generate breadcrumbs for any page or custom post type that uses parent pages to establish hierarchy. I’ve opted to only show breadcrumbs on pages that have at least one parent. If your page doesn’t have a parent, nothing will show up.

To get started, paste this function into functions.php:

function easy_breadcrumbs($post) {
    $parent_id = $post->post_parent;
    if ($parent_id == 0) { return false; }
    else {
        $output = '';
        while ($parent_id != 0) {
            $ancestor = get_post($parent_id);
            $output = '<li><a href="'.get_permalink($ancestor->ID).'">'.$ancestor->post_title.'</a></li>' . $output;

            $parent_id = $ancestor->post_parent;
        }
        return '<ul class="breadcrumbs"><li><a href="'.home_url().'">Home</a></li>'.$output.'</ul>';
    }
}

To display the breadcrumbs, paste the following code into your template inside of the loop:

<?php echo easy_breadcrumbs($post); ?>

Now you have an unordered list. To make it look like you’d expect, you’ll need a little css. Something like this should do the trick:

.breadcrumbs {
	padding: 0;
	margin: 0;
}
.breadcrumbs li {
	display: inline-block;
	list-style: none;
}
.breadcrumbs li + li:before {
	content: ">";
	display: inline-block;
	margin: 0 .4em 0 .2em;
}

Get Just The Path from a Request in PHP

It can be a little tricky to get just the path of a request in PHP. $_SERVER['REQUEST_URI'] includes the query string. $_SERVER['SCRIPT_NAME'] may return index.php instead of the request if you’re using a CMS like WordPress which rewrites URLs.

The most reliable method I’ve found for returning only the path without the query string uses PHP’s built in parse_url() function:

$path_only = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

Uptime Robot WordPress Plugin

I’ve been using a simple, free uptime monitoring service called Uptime Robot lately to monitor a few of my sites. It will check up to 50 sites every 5 minutes to determine if they are online or offline, log any downtime events, and optionally notify you when your sites are down, all for free.

I wrote a quick WordPress plugin which creates a dashboard widget with your most recent Uptime Robot log entries. You can either monitor your entire account, or a single site. Just add the correct API key to the settings page.

You can download Uptime Robot for WordPress from the official plugin directory or through your WordPress Admin.

Get An RSS Feed Of Your Youtube Subscriptions

Updated January 6, 2014 - This post has been updated to work with the latest changes to YouTube as of January 2014. I’ll try to keep it up-to-date with future YouTube interface changes.

Following the announcement that Google Reader will be shutting down, I’ve been looking for a new place to read my content. I’m still not sure where I’ll land on that, but the change has me thinking about how I consume content as well. I’ve decided I’d like to do more of it in fewer places (the goal of RSS to begin with.) To that end, I’ve added my Youtube subscriptions to my feed reader. Here’s how you can get an RSS feed for your Youtube subscriptions, too:

Make Your Feed Available

First, make sure your feed is publicly available. Go to http://www.youtube.com/account_privacy and uncheck “Keep all my subscriptions private.”

Get Your User ID

Next, get your Youtube user ID at http://www.youtube.com/account_advanced. You’ll see your YouTube User ID listed.

Finally, replace {USER_ID} in the following address with your own User ID and you’ll have an RSS feed for new videos from your subscription list.

http://gdata.youtube.com/feeds/base/users/{USER_ID}/newsubscriptionvideos

 

Updated Fluid App Userscript for Gmail Unread Count

Screen Shot 2012-12-19 at 9.39.48 AMI’ve been enjoying using a Fluid App for my Google Mail account and I bought the Pro version for $5, primarily so I could get a badge in my dock with a count of unread messages. Unfortunately, the script that ships with the app to display this account no longer works, likely due to changes in Gmail itself. The original script parses the very complex markup to get the inbox value. My simplified script just reads the window title to determine the unread count. Here’s how to install the script:

  • Window > Userscripts
  • Create a new script
  • Pattern: “*mail.google.com*”
  • Script:
window.fluid.dockBadge = '';
setTimeout(updateDockBadge, 3000);
setInterval(updateDockBadge, 15000);

function updateDockBadge() {
	var title = document.title;
	var regex = /s*Inboxs*((d+))[^d]*/;
	var res = title.match(regex);
	if (res && res.length > 1) {
		var newBadge = res[1];
		window.fluid.dockBadge = newBadge;
	}
	else {
		regex = /^Inbox -/;
		if(regex.test(title)){
			window.fluid.dockBadge = '';
		}
	}
}

How it works:

It reads the window title and detects if you’re in the inbox and if there’s a number representing unread messages.

  • If so, it puts that number in the badge
  • If not, but you are in the inbox, it clears the badge
  • If you are viewing a message it does nothing to the badge since the unread count only shows on the inbox

This is obviously less technically clever than a script that reads the inbox count from the page markup directly, but it’s much less likely to break with changes to Google Mail, and much easier to understand and therefore fix if something does break.

As an aside, if you’re looking for a fancy Gmail icon, check out this set in the flickr Fluid Icon Pool.

Update: This works if you use English language settings for Gmail. Otherwise, you’ll have to change the word “inbox” to whatever is appropriate in your language.

Zeitgeist.css Chrome Extension

I’ve put together a small Google Chrome extension which automatically adds Zeitgeist.css to any page which is unstyled. Install the extension here, or read on for more info. and source.

About Zeitgeist.css

Zeitgeist.css is a fun project started by Ryan Freebern which aims to create a default styling for web pages that reflects the aesthetics of the day, whenever that day may be. In Ryan’s word’s:

zeitgeist.css is a crowdsourced, extendable basic CSS file that imparts a design based on current design aesthetics to any simple HTML file, such as those produced by compiling markdown.

Think of it this way: If you make a web page and add no styles, it looks dated. Zeitgeist.css aims to bring those pages up to date easily. As easy as Ryan makes it, however, it isn’t automatic. That’s where this extension comes in. It checks every page using JavaScript’s querySelectorAll method to determine whether styles have been applied via a link element or a style element. If not, Zeitgeist.css is automatically applied.

Design Refresh

For the first time in years I’m making not-insignificant changes to the design of this site. The last design even survived a complete rewrite and update of the HTML. Now I’m adding a fresh coat of paint to complete the update. I’ll be iterating on this design for a while–consider it something of a live redesign. There may be a few rough edges, but I’ll try to smooth them out over time. Thanks for sticking around.

Advice for the Geographically Challenged Employee (AKA Working Remotely)

Ryan Irelan of Happy Cog recently posted about the challenges of working remotely as part of a team in the web development industry. I’ve got some experience with that; before moving back to Vermont I spent about a year working from an apartment in Florida, 1400 miles away from the rest of my team. A lot of what Ryan said resonates with my own experience. He touched on keeping a strict schedule for certain tasks and emphasizing certain types of communication to minimize interruptions and protect your time. He also talked about techniques he uses to avoid breakdowns in communication that can occur when you’re never face to face with anyone. He has some great tips that are probably almost as valuable if you do work with your team in an office.

I’ve got a few other tips that I’ll throw out, just for kicks:

Communication

Ryan touched on this. Use as many methods of communication as you need to make sure everyone is on the same page. Then take it a little farther. Know what everyone on the team is up to and let them know what you’re up to. Check in about non-work stuff, too (but only when it’s not going to be an interruption.) It’s tough to keep a good working relationship going via single-sentence emails.

Discipline

You may be working 6 feet from your comfy bed. You may be tempted to oversleep. You may have lots of great stuff to play with at home. You may have cool games on your computer that call to you. You may have friends asking you to hang out (you don’t really work, anyway. Right?) Ignore it all. Don’t fall into these traps. Don’t tell yourself “I can sleep in 10 extra minutes and no one will know.” It’s a slippery slope. You’re a professional and you should act exactly as you would in an office with other professionals. Arrange schedules to keep yourself on task. Always be available at the same time every day. Communicate often. Stay focused. Discipline is absolutely the key to working successfully when separated from your team by geography.

For me, keeping rigid discipline in my workday was the way to make sure I didn’t inadvertently abuse my employer’s trust or let down my team members. And it paid off. I was the most productive I had ever been.

Shoes

Seriously. I don’t remember where I read this tip originally, but it always helped me. Something about wearing shoes always made it feel like I was out of the house and into the office, even though I was working from my bedroom desk. If you’re struggling for focus, slap on a pair of shoes and tie them, tightly. This is not a joke.