WPMU Asides

After quite a bit of debugging and hacking I have “asides” working in WPMU now. Hopefully I can publish a new release early next week , so send your patches to me at donncha @ linux.ie if you want them included.
I also noticed a spelling typo – edit your post.html and change {the_category seperator=", "} to {the_category separator=", "} – otherwise your category separator will be ignored!

Update – I created a Smarty plugin that checks the category array for “Asides”. This means you can have an asides-format post that’s also in your humour category. Wait for the new release of WPMU for the plugin!

If you want to update your install so you can post asides do the following:

Create a category called “Asides”.

Edit wp-inst/index.php and look for the following line:
$content .= $wpsmarty->fetch( 'post.html' );
Insert two lines before that one:

$category = get_the_category();
$wpsmarty->assign( “category”, $category[0]->cat_name );

Edit your post.html so it looks like this:

{the_date d=” before='<p class=”date”>’ after='</p>’}
{if $category != ‘Asides’}
{is_aside}
{if $is_aside == false}
…..
…..
most of the body of the comments template goes here.
…..
…..
{else}
<div class=”storyContent”><p>{get_the_content} {comments_popup_link zero='(0)’ one='(1)’ more='(%)’}</p></div>
{/if}

{link_pages before='<br />Pages: ‘ after='<br />’ next_or_number=’number’}

The code I added is in italics. Note that asides won’t be filtered by the automatic filters. Is there a way of getting the post content without “echo”ing it out? I need to replace the last </p> of the content because it pushes the comments link down way too much! That means returning it and feeding it into a Smarty modifier. (ie. {the_content|regex_replace:”/^<\/p>$/”:””} doesn’t work because nothing is returned.)
(If WordPress mangles the code above, take a look at my post.html for a clearer explanation.
(If you’re wondering, I’m using the “KDE About” star as an icon for aside entries.)

Bye bye Referer Spammers!

Take a quick look at your logfiles any time and you’re likely to see referer spam in there somewhere. Not only do those requests pollute your log files and stats pages, but they also consume resources on your server when you serve them pages that aren’t even going to be viewed by anyone. Here’s one way of stopping the spammers eating into your server resources:

  • Look through your logfiles and examine the referers. Here’s a quick bit of code to do that. (Remove the backslashes (“\”) from before double quotes. WP is putting them in on me!) :
    awk '{print $11}' < /var/log/apache2/access_log| sort|uniq -c|sort -r|grep -v "mydomain.com"|less
  • Copy and paste any likely looking referer spam sites somewhere else for safe keeping. The ones that use most of your resources will be at the top of the list.
  • Add this code to some page that every page on your site loads, it should be included before main execution of the page occurs. Fill in the array of referer sites with the list your assembled from your log file. I’ve added a few from this morning’s log file.
    if( isset( $_SERVER["HTTP_REFERER"]  ) )
    {
        $referers_to_avoid = array(
                "ttp://texas-holdem.andrewsaluk.com",
                "ttp://www.highprofitclub.com/",
                "ttp://www.sex4singles.com/",
                "ttp://www.parishillton.com/",
                "ttp://www.moneylinebet.com/",
                "ttp://www.free-hentai-anime-sex.com",
                "ttp://www.bondage-bdsm.us",
                "ttp://www.handjob-movies.us",
                "ttp://www.zoothumbnails.com",
                "ttp://www.bestiality-animal-sex-stories.com",
                "ttp://www.gay-men-sex-movies.com",
                "ttp://russ-darrow-kia.gq.nu/",
                "ttp://nissan-xterra.sbn.bz/",
                "ttp://nissan-thermos.gq.nu/",
                "ttp://folding-chair.wol.bz/",
                "ttp://www.xcites-0-cost-interracial-cum-teen-sex-movie.com"
        );
        while( list( $key, $val ) = each( $referers_to_avoid ) )
        {
            if( strpos( $_SERVER["HTTP_REFERER"], $val ) )
            {
                die();
            }
    
        }
    }
  • Add an error_log() to the “if” condition to spot when a spammer visits.
  • Add this to index.php of a WordPress installation to protect your blog and make your legitimate requests go that much faster!

WordPress Multiuser, WP1.5 Sync

There’s a new snapshot available now! In brief, changes include increased use of PEAR Cache, updated Smarty install, referer listings hide direct and internal requests by default. Updated Kitten’s Spaminator and WordPress code of course!
Go download it now and use the support forums if you have a question!
Later… I updated and packaged my collection of WPMU themes again and they’re available from the download page!

What's the GPL? WordPress and PEAR Cache Problems

Ben Ramsey explores some of the issues when you write GPLed code that uses code from the PEAR library.
I had forgotten about the differing licenses used by PEAR and WordPress. They’re unfortunately incompatible and you can’t ship PHP licensed code in a GPL project without an “exception clause” in your GPL license. A change to the license of WordPress would require the agreement of *all* copyright holders of code in the project AFAIK.
Thankfully, I don’t ship PEAR Cache with WordPress MU. I use it if it’s installed already, WPMU isn’t dependant on PEAR Cache being available to work.
I think that gets around the incompatibility. Doesn’t it?

Google "nofollow"

Well, Google’s nofollow attribute is one way of putting off comment-spammers but it won’t stop them. They’ll continue to spam in case they come across a site that doesn’t support the new attribute.
I may look at adding rel=”nofollow” to links here, but it’d be handy to have a list of “safe” URLs that are safe to link to. Perhaps a WP plugin, backend interface and db table?
In other news, the number of spams getting through to the moderation queue has dwindled down to zero (besides the edgesaver one of course!) so it’s not a problem here right now.

PEAR Output Cache and WPMU

One of those things PHP doesn’t do well is load large libraries of scripts into memory and parse them quickly. WordPress and Smarty fall firmly into this category and the caching I’ve done so far has only addressed half of this problem: cached pages don’t load any WordPress code, but the heavy Smarty library was still loaded.

I’ve now modified my code to use the PEAR Output Cache and that avoids loading the Smarty templating system. On a heavily loaded server this should make quite a difference to visitors. Things still need tweaking, I may need to introduce a “time” aspect to the cache key as pages could be cached indefinitely but for now it seems to be working really well!
Note to self, please remember that gzip compression upsets PHP’s output buffer. Note to everyone else, don’t set “gzip compression” in the backend or your blog will be foobarred! (Thanks Mel for testing his blog and reporting problems with it!)

WPMU Registration Page – alpha quality

Open this file in your browser, download and copy into your wp-inst/ folder as “wp-newblog.php”
Create the following entry in your root .htaccess file too (modify to suit your site):
RewriteRule ^([_0-9a-z-]+)/wp-newblog.php(.*) /wp-inst/wp-newblog.php [L]
Call it by going to http:// example.com/main/wp-newblog.php
It’s a very simplistic script, there’s no error checking, it creates a new directory before handing over control to the WordPress install.php
Give it a whirl but when you’re finished be sure to delete it or move it out of the way!