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 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. [see Figure 1]
  2. Within a single file, use the function drop-down menu in the Textmate window footer — useful for quickly scanning all the function names. [see Figure 2]
Figure 1: Find in Project

Figure 1: Textmate Find in Project

Figure 2: Textmate Function Menu

Figure 2: Textmate Function Menu

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
// get posts from current blog
$self_posts = get_posts(array(
    'numberposts' => 4
));

// switch blogs
switch_to_blog(1);

// 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

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:

<?php
foreach ($posts as $post) {
    setup_postdata($post);

    // switch blogs if post domain doesn't match blog domain
    if (parse_url($post->guid, PHP_URL_HOST) != parse_url(get_bloginfo('url'), PHP_URL_HOST)) {
        switch_to_blog(1);
    }
?>
<div class="post">
    <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</div>
<?php
    // switch back (no need to re-test condition)
    restore_current_blog();
}
?>

    

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!


Google Analytics and its Tiny URLs

Google.  I love your products.  But please… usability!

As a user on several Google Analytics accounts encompasing many website profiles, it would be really helpful if I could tell — at a glance — which one I’m looking at.  Typically, one would do that with some type of contextual information — a header of sorts — that contains the title of the page.

The Google Analytics solution to the “what page am I on problem”?  A drop-down selection item.  Boo.

Move that stuff down.  Make it bigger!

google-analytics-title-fail