WordPress: Pass variables by reference with apply_filter

WordPress has this great filtering system which allows you to write plugins. Yesterday, I was writing a plugin that has the ability for other plugins to change it's behaviour.

For the particular functionality, it would be very nice to use two parameters, which should both be changable.

Standard PHP

In standard PHP, you could do:

function doit($in, &$var2){
    $var2=true;
    return $in+1;
}
 
$changed=false;
echo doit(1,$changed);
echo $changed;

Pass by reference: Not working with WordPress

The WordPress apply_filter and add_filter functions do not allow variable passing by reference. Therefore, the following code will not work.

function doit($in, &$var2){
    $var2=true;
    return $in+1;
}
 
add_filter('myfilter','doit',10,2);
$changed=false;
echo apply_filters('myfilter',1,$changed);
echo $changed;

Dirty solution

You could use $GLOBALS to overcome this problem. I would not recommend this method, as it's not flexible, not safe to re-use and requires the function and the main code to be synchronized.

function doit($in){
    global $changed;
    $changed=true;
    return $in+1;
}
 
add_filter('myfilter','doit');
$changed=false;
echo apply_filters('myfilter',1);
echo $changed;

The good solution

The correct solution to this problem, is to combine all variabled in one array, and use this array as the first variable.

Example 1: For a few parameters

function doit($in){
    list($in,$var2)=$in;
    $var2=true;
    return array($in,$var);
}
 
add_filter('myfilter','doit');
$changed=false;
list($in,$changed)=apply_filters('myfilter',array(1,$changed));
echo $in;
echo $changed;

Example 2: For more complex situations

function doit($in){
    $in['changed']=true;
    $in['in']+=1;
    return $in;
}
 
add_filter('myfilter','doit');
$changed=false;
$in=1;
extract(  apply_filters('myfilter',compact('in','changed'))  );
echo $in;
echo $changed;

This last method may impose a security risk if you use third party plugins.

© GeekLabInfo WordPress: Pass variables by reference with apply_filter is a post from GeekLab.info. You are free to copy materials from GeekLab.info, but you are required to link back to https://www.geeklab.info

1 Star2 Stars3 Stars4 Stars5 Stars (7 votes, average: 3.71 out of 5)
Loading...

WordPress spam filtering: improved.

On this WordPress blog, I'm running the WP Hashcash plugin to prevent spam. Recently, I've seen a lot more spam, I guess spambots now recognise WPHC encryption.

WPHC encryption could be upgraded to withstand spam again. But new bots will break new encryption. The biggest problem is that all blogs using WPHC use the same javascript to decode the key. If only you could be a liiiiittle different from other blogs, standard bots wouldn't have a chance.

My solution is to include a few filters in WPHC. This allows for weblog owners to write a tiny plugin to have slightly different antispam than other weblogs. For instance, at this moment, my extension is as simple as:

<?php
/*
Plugin Name: WPHC Extension
Plugin URI: https://www.geeklab.info/2010/04/wordpress-spam-filtering/
Description:
Author: GeekLab.info
Version: 1.0
Author URI: https://www.geeklab.info
License: GPL
*/
function wphc_jskey_ext($js){
for($i = 0; $i < count($js); $i++)
$js[$i]--;
return $js;
}
function wphc_getjs_ext($in){
return preg_replace(';//WPHC2;','wphc_data[i]=wphc_data[i]+1;',$in);
}
add_filter('wphc_jskey', 'wphc_jskey_ext');
add_filter('wphc_getjs', 'wphc_getjs_ext');
?>

You may use substraction, addition, xor, byte-swapping or any other method you like to improve security. The security is not so much what is done to the key, but that the routine is slightly different from other blogs.

Changes to WP Hashcash required for this to work:
Patch file (only changes)
Whole file

© GeekLabInfo WordPress spam filtering: improved. is a post from GeekLab.info. You are free to copy materials from GeekLab.info, but you are required to link back to https://www.geeklab.info

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading...

Windows update: Install at night

In order to keep my users from getting windows update messages, I try to install any client updates at night. I have a few tricks to make this possible:

1: Boot up at night

Most computers can boot up automatically at night, using Wake-On-LAN. If your computer or its NIC does not support WOL, you can use the bios' power management to boot at night.

Don't start all computers at the exact same time, as this will result in a power peak - better spread it, like 5 computers per minute.

Continue Reading…

© GeekLabInfo Windows update: Install at night is a post from GeekLab.info. You are free to copy materials from GeekLab.info, but you are required to link back to https://www.geeklab.info

1 Star2 Stars3 Stars4 Stars5 Stars (2 votes, average: 2.50 out of 5)
Loading...

Windows update: Force update right now

I use the following script batch file to force Windows Updates or the WSUS client to start the update process:

@echo off
rem Stop the Windows update service:
net stop wuauserv
rem Delete registry keys that store information about the last update.
REG DELETE "HKLM\Software\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update" /v LastWaitTimeout /f
REG DELETE "HKLM\Software\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update" /v DetectionStartTime /f
REG DELETE "HKLM\Software\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update" /v NextDetectionTime /f
rem Start the Windows update service:
net start wuauserv
rem Force detection of updates
wuauclt /detectnow
rem Sleep 4 seconds so you can read messages:
ping localhost >nul

© GeekLabInfo Windows update: Force update right now is a post from GeekLab.info. You are free to copy materials from GeekLab.info, but you are required to link back to https://www.geeklab.info

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading...

Schedule Windows server to reboot or shutdown

Yesterday, I installed an update on a Windows server that could not be rebooted during the day. To apply the update, I scheduled a reboot of the server in the evening.

Continue Reading…

© GeekLabInfo Schedule Windows server to reboot or shutdown is a post from GeekLab.info. You are free to copy materials from GeekLab.info, but you are required to link back to https://www.geeklab.info

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading...

KB953297 installation fails – working solution!

I just described that KB974417 fails to install on a few of my clients. Well, so does KB953297.

Unforunately, I don't have error messages for this update. But I can tell how I fixed it:

The fix

Trying to install NDP1.1sp1-KB953297-X86.exe, I got the message that the software we're updating is not installed. It most definitely was. I just downloaded NDP1.1sp1-KB867460-X86.exe and installed it right over the existing installation. After that, KB953297 was successfully deployed.

© GeekLabInfo KB953297 installation fails - working solution! is a post from GeekLab.info. You are free to copy materials from GeekLab.info, but you are required to link back to https://www.geeklab.info

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading...

KB974417 install fails – working solution!

Please read this updated article instead.
This page remains available for archiving purposes.

I recently installed a new Microsoft WSUS server. Most of it went just fine. Except for a few updates that weren't needed according to windowsupdate.com, but were required according to WSUS.

Especially KB974417 was pretty annoying. I tried installing it a dozen times, but after each reboot, WAU came back telling the update was ready to install. I checked out the eventvwr, and got the following useless message:
Event Type: Error
Event Source: HotFixInstaller
Event Category: None
Event ID: 5000
Date: 3/16/2010
Time: 3:06:25 PM
User: N/A
Computer: PC1
Description:
EventType visualstudio8setup, P1 microsoft .net framework 2.0-kb974417, P2 1033, P3 1642, P4 msi, P5 f, P6 9.0.40302.0, P7 install, P8 x86, P9 w2k3r2, P10 0.

Installing it manually

I downloaded the file from the Microsoft website, to find that the update itself thought itwasn't needed as well: None of the products that are addressed by this software update are installed on this computer. Click Cancel to exit setup.

So what I did:

Continue Reading…

© GeekLabInfo KB974417 install fails - working solution! is a post from GeekLab.info. You are free to copy materials from GeekLab.info, but you are required to link back to https://www.geeklab.info

1 Star2 Stars3 Stars4 Stars5 Stars (21 votes, average: 5.00 out of 5)
Loading...