Archive for July, 2009

WordPress MU: Cross-Posting with "switch_to_blog()"

This weekend I tackled a MU template challenge that I’d been procrastinating on because I thought it would be really tough.  The problem, simply, was that I needed to display posts from one MU blog on another blog within my MU installation.

The answer: a handly pair of WordPress MU functions called switch_to_blog() and restore_current_blog().  Using these functions, you can jump around temporarily between MU blogs, allowing you to pull posts — or anything else, I presume — from wherever you like.  It’s as easy as:

<?php
// do some stuff on the current blog...
switch_to_blog(9);
// ...do some stuff on the other blog...
restore_current_blog();
// ...do some stuff back on the current blog
?>

Read on for more detail…

Searching for and Discovering WordPress Functions

When I am trying to learn something new about WordPress’s code, the first thing I do is open the whole WordPress directory the wp-includes directory (where most of the interesting functions live) as a Textmate project.  That lets me do two important things:

  1. Search through all the files at once, using Find In Project (Cmd + Shift + F…) — useful for following the labyrinth of function calls.
  2. Within a single file, use the function drop-down menu in the Textmate window footer — useful for quickly scanning all the function names.

To solve this problem, I had very little idea what to look for.  At first, I examined the get_posts() function in /wp-includes/post.php, thinking I’d be able to pass in a blog ID, and just get posts from a specific blog.  That yeilded some interesting information, but I couldn’t find any way to get another blog’s posts simply.  So I switched tracks and focused on the file /wp-includes/wpmu-functions.php, figuring there must be some hints amongst the MU-specific code.

Didn’t take much looking to discover switch_to_blog()… not exactly what I had been looking for, but I figured it was worth a shot.

An Example of Switching Blogs

After a little theme massaging, here’s what I ended up with, and it worked perfectly!

<?php

$other_blog_id = 1;

// get posts from current blog
$self_posts = get_posts(array(
    'numberposts' => 4
));

// switch blogs
switch_to_blog($other_blog_id);

// get some posts from the other blog
$other_posts = get_posts(array(
    'numberposts' => 4
));

// ok, we're done with that other blog
restore_current_blog();

// merge the two arrays
$posts = array_merge($self_posts, $other_posts);

// sort the entire array by date
function sort_posts_array_by_post_date($a, $b) {
    if ($a->post_date == $b->post_date)
        return 0;
    return $a->post_date < $b->post_date ? -1 : 1;
}
usort($posts, 'sort_posts_array_by_post_date');
?>

That left me with a sorted array of posts, from two separate blogs.  All I had to do then was loop through and output all the post content…

One More Gotcha… Switch Again For Post Template Functions Use get_blog_permalink()

Everything looked ok, but a little testing revealed that permalinks weren’t working… they were linking to the wrong URL.  So, I had to switch back to right blog for each post before using standard WP template functions, like this:

UPDATE: @Bira pointed out in the comments that there’s a function called get_blog_permalink() that seems to do exactly what I wanted… get the permalink to a post in another blog.  So I deleted the code sample below.  Instead of switching back-and-forth for each post, it would make sense to stash the blog id for posts when you retrieve them from the other blog, then use it when calling get_blog_permalink().

Installing Brother Printer Driver from OS X Install Discs

After a hard drive failure and replacement, I reinstalled OS X with “printer drivers” un-checked.  Of course it would be easy to get the ONE driver I needed later, right?  Wrong.  It wasn’t super-difficult, but I figured I’d save y’all the trouble of repeating the research…

How to Install the Brother MFC7820N Driver
For OS X users at IndyHall
The Abridged Instructions:

  1. Download this Brother Printer Driver:  Brother MFC-7820N.gz, and double-click to un-gzip it.
  2. Open System Preferences > Print & Fax.
  3. Add a printer (+), select Print Using: “Other…”, choose the file “Brother MFC-7820N”
  4. Click “OK”, print a test page… you’re done!

Director’s Cut:

Here’s what I had to do to gain access to the IndyHall printer… documenting this as I do it, and will summarize afterward.

  1. Google search: “os x install printer drivers from dvd”
    Result 1 looked promising:  Installing printer drivers only – OS X Server – MacTalk Forums
  2. Reply to forum question mentions “Pacifist” as software that will let you get the printer drivers off the install dics… but there’s no link.
  3. Google search: “os x pacifist”
    Result 1 wins again: CharlesSoft – software you always wished someone would write
  4. Downloaded and installed Pacifist, which lets you look inside the OS X install discs or installer packages.
  5. Ran the app, clicked on the “Open Apple Install Discs” button (duh) :)
  6. Searched down through the directories and found my Brother driver at:
    • Contents of OSInstall.mpkg
      • Contents of PrinterDriversGroup
        • Contents of BrotherPrinterDrivers.pkg
          • Library
            • Printers
              • PPDs
                • Contents
                  • Resources
                    • Brother MFC-7820N.gz
  7. Dragged-and-dropped that file to the desktop (had to enter admin password), then double-clicked the file to un-gzip it
  8. Opened OS X System Preferences > Print & Fax
  9. Clicked on “+” below left table to add a printer
  10. Selected the printer from the list of available printers
  11. In the “Print Using” drop-down menu, selected “Other…”, which opened a find-file sheet.
  12. Picked the brother driver from the desktop… but hesitated, wondering if I should store the printer driver elsewhere before doing this.  Asked Allum, who said to just go for it.  Clicked “OK”.
  13. Printed a test page with no problems… printer installed!